/* eslint-disable sort-keys-fix/sort-keys-fix */

const OFF = 0;
const WARN = 1;
const ERROR = 2;

module.exports = {
  parser: '@typescript-eslint/parser',
  plugins: [
    '@typescript-eslint',
    'simple-import-sort',
    'sort-keys-fix',
    'typescript-sort-keys',
  ],
  extends: [
    'next/core-web-vitals',
    'eslint:recommended',
    'plugin:@typescript-eslint/recommended',
    'prettier',
  ],
  settings: {
    react: {
      version: 'detect',
    },
  },
  rules: {
    camelcase: [ERROR, { properties: 'never', ignoreDestructuring: true }],
    'capitalized-comments': [
      ERROR,
      'always',
      { ignoreConsecutiveComments: true },
    ],
    'consistent-this': ERROR,
    curly: ERROR,
    'dot-notation': ERROR,
    eqeqeq: [ERROR, 'smart'],
    'func-name-matching': ERROR,
    'func-names': [ERROR, 'as-needed'],
    'func-style': [ERROR, 'declaration', { allowArrowFunctions: true }],
    'guard-for-in': ERROR,
    'init-declarations': ERROR,
    'no-console': [ERROR, { allow: ['warn', 'error', 'info'] }],
    'no-else-return': [ERROR, { allowElseIf: false }],
    'no-extra-boolean-cast': ERROR,
    'no-lonely-if': ERROR,
    'no-shadow': OFF,
    'no-unused-vars': OFF, // Use @typescript-eslint/no-unused-vars instead.
    'object-shorthand': ERROR,
    'one-var': [ERROR, 'never'],
    'operator-assignment': ERROR,
    'prefer-arrow-callback': ERROR,
    'prefer-const': ERROR,
    'prefer-destructuring': [
      ERROR,
      {
        object: true,
      },
    ],
    radix: ERROR,
    'spaced-comment': ERROR,

    'react/button-has-type': ERROR,
    'react/display-name': OFF,
    'react/destructuring-assignment': [ERROR, 'always'],
    // 'react/hook-use-state': ERROR,
    'react/no-array-index-key': ERROR,
    'react/no-unescaped-entities': OFF,
    'react/void-dom-elements-no-children': ERROR,

    'react/jsx-boolean-value': [ERROR, 'always'],
    'react/jsx-curly-brace-presence': [
      ERROR,
      { props: 'never', children: 'never' },
    ],
    'react/jsx-no-useless-fragment': ERROR,
    'react/jsx-sort-props': [
      ERROR,
      {
        callbacksLast: true,
        shorthandFirst: true,
        reservedFirst: true,
      },
    ],

    '@next/next/no-img-element': OFF,
    '@next/next/no-html-link-for-pages': OFF,

    '@typescript-eslint/array-type': [
      ERROR,
      { default: 'generic', readonly: 'generic' },
    ],
    '@typescript-eslint/consistent-generic-constructors': [
      ERROR,
      'constructor',
    ],
    '@typescript-eslint/consistent-indexed-object-style': [ERROR, 'record'],
    '@typescript-eslint/consistent-type-definitions': [ERROR, 'type'],
    '@typescript-eslint/consistent-type-imports': ERROR,
    '@typescript-eslint/no-duplicate-enum-values': ERROR,
    '@typescript-eslint/no-for-in-array': ERROR,
    '@typescript-eslint/no-non-null-assertion': OFF,
    '@typescript-eslint/no-unused-vars': [ERROR, { argsIgnorePattern: '^_' }],
    '@typescript-eslint/no-shadow': ERROR,
    '@typescript-eslint/prefer-optional-chain': ERROR,
    '@typescript-eslint/require-array-sort-compare': ERROR,
    '@typescript-eslint/restrict-plus-operands': ERROR,
    '@typescript-eslint/sort-type-union-intersection-members': ERROR,

    // Sorting
    'typescript-sort-keys/interface': ERROR,
    'typescript-sort-keys/string-enum': ERROR,
    'sort-keys-fix/sort-keys-fix': ERROR,
    'simple-import-sort/exports': WARN,
    'simple-import-sort/imports': [
      WARN,
      {
        groups: [
          // Ext library & side effect imports.
          ['^~?\\w', '^\\u0000', '^@'],
          // Lib and hooks.
          ['^~/lib', '^~/hooks'],
          // Static data.
          ['^~/data'],
          // Components.
          ['^~/components'],
          // Other imports.
          ['^~/'],
          // Relative paths up until 3 level.
          [
            '^\\./?$',
            '^\\.(?!/?$)',
            '^\\.\\./?$',
            '^\\.\\.(?!/?$)',
            '^\\.\\./\\.\\./?$',
            '^\\.\\./\\.\\.(?!/?$)',
            '^\\.\\./\\.\\./\\.\\./?$',
            '^\\.\\./\\.\\./\\.\\.(?!/?$)',
          ],
          ['^~/types'],
          // {s}css files
          ['^.+\\.s?css$'],
          // Others that don't fit in.
          ['^'],
        ],
      },
    ],
  },
};