import globals from 'globals';
import reactPlugin from 'eslint-plugin-react';
import reactHooksPlugin from 'eslint-plugin-react-hooks';
import stylisticPlugin from '@stylistic/eslint-plugin';

export default [
  {
    ignores: ['node_modules/**', 'vendor/**', 'var/**', 'public/build/**'],
  },
  {
    files: ['**/*.{js,mjs,cjs,jsx,ts,tsx}'],
    plugins: {
      react: reactPlugin,
      'react-hooks': reactHooksPlugin,
      '@stylistic': stylisticPlugin,
    },
    languageOptions: {
      globals: {
        ...globals.browser,
        ...globals.node,
      },
      parserOptions: {
        ecmaVersion: 'latest',
        sourceType: 'module',
        ecmaFeatures: {
          jsx: true,
        },
      },
    },
    settings: {
      react: {
        version: 'detect',
      },
    },
    rules: {
      'yoda': ['error', 'always'],
      'arrow-body-style': ['error', 'as-needed'],
      'no-empty': ['error', { 'allowEmptyCatch': true }],
      'no-multiple-empty-lines': 1,
      'no-unused-vars': ['error', {
        'vars': 'all',
        'args': 'after-used',
        'caughtErrors': 'none',
        'ignoreRestSiblings': false,
        'reportUsedIgnorePattern': false,
      }],
      'react/react-in-jsx-scope': 'off',
      'react/prop-types': 'off',
      'react-hooks/rules-of-hooks': 'error',
      'react-hooks/exhaustive-deps': 'warn',
      '@stylistic/semi': 0,
      '@stylistic/comma-dangle': [1, {
        arrays: 'only-multiline',
        objects: 'only-multiline',
        imports: 'only-multiline',
        exports: 'only-multiline',
        functions: 'only-multiline',
      }],
      '@stylistic/operator-linebreak': ['error', 'before'],
      '@stylistic/indent': ['error', 2, { SwitchCase: 1 }],
      '@stylistic/space-before-function-paren': ['error', {
        anonymous: 'never',
        named: 'never',
        asyncArrow: 'always',
      }],
      '@stylistic/arrow-parens': ['error', 'as-needed', {
        requireForBlockBody: false,
      }],
      '@stylistic/arrow-spacing': ['error', {
        before: true,
        after: true,
      }],
      '@stylistic/no-mixed-spaces-and-tabs': 1,
      '@stylistic/jsx-closing-bracket-location': 1,
      '@stylistic/jsx-closing-tag-location': 1,
      '@stylistic/jsx-curly-brace-presence': [1, 'never'],
      '@stylistic/jsx-curly-spacing': 1,
      '@stylistic/jsx-equals-spacing': 1,
      '@stylistic/jsx-first-prop-new-line': [1, 'multiline-multiprop'],
      '@stylistic/jsx-pascal-case': [1, {
        allowAllCaps: false,
        allowNamespace: true,
        allowLeadingUnderscore: false,
      }],
      '@stylistic/no-multi-spaces': 1,
      '@stylistic/jsx-self-closing-comp': ['error', {
        component: true,
        html: true,
      }],
      '@stylistic/jsx-wrap-multilines': [1, {
        declaration: 'parens-new-line',
        assignment: 'parens-new-line',
        return: 'parens-new-line',
        arrow: 'parens-new-line',
        condition: 'ignore',
        logical: 'parens-new-line',
        prop: 'parens-new-line',
        propertyValue: 'parens-new-line',
      }],
      '@stylistic/jsx-tag-spacing': [1, {
        closingSlash: 'never',
        beforeSelfClosing: 'always',
        afterOpening: 'never',
        beforeClosing: 'allow',
      }],
    },
  },
  {
    files: ['**/*.jsx'],
    rules: {
      'react/jsx-uses-vars': 'error',
      'no-unused-vars': ['error', {
        varsIgnorePattern: '^React$',
        args: 'after-used',
        caughtErrors: 'none',
        ignoreRestSiblings: false,
        reportUsedIgnorePattern: false,
      }],
    },
  },
];
