module.exports = {
	settings: {
		'import/resolver': {
			node: {
				extensions: ['.ts', '.tsx', '.js', '.ios.js', '.android.js', '.native.js', '.ios.tsx', '.android.tsx']
			}
		}
	},
	parser: '@babel/eslint-parser',
	extends: ['@rocket.chat/eslint-config', 'prettier'],
	parserOptions: {
		sourceType: 'module',
		ecmaVersion: 2017,
		ecmaFeatures: {
			experimentalObjectRestSpread: true,
			jsx: true,
			legacyDecorators: true
		}
	},
	plugins: ['react', 'jsx-a11y', 'import', 'react-native', '@babel', 'jest', 'react-hooks'],
	env: {
		browser: true,
		commonjs: true,
		es6: true,
		node: true,
		jquery: true,
		mocha: true,
		'jest/globals': true
	},
	rules: {
		'import/extensions': [
			'error',
			'ignorePackages',
			{
				js: 'warning',
				jsx: 'warning',
				ts: 'warning',
				tsx: 'warning'
			}
		],
		'react/jsx-filename-extension': [
			1,
			{
				extensions: ['.js', '.jsx', '.ts', '.tsx']
			}
		],
		'react/require-default-props': [0],
		'ordered-imports': [0],
		'react/no-did-mount-set-state': 0,
		'react/no-multi-comp': [0],
		'react/jsx-indent-props': [2, 'tab'],
		'jsx-quotes': [2, 'prefer-single'],
		'jsx-a11y/href-no-hash': 0,
		'jsx-a11y/aria-role': 0,
		'import/prefer-default-export': 0,
		'import/no-cycle': 0,
		'import/order': [
			'error',
			{
				'newlines-between': 'ignore'
			}
		],
		camelcase: 0,
		'no-underscore-dangle': 0,
		'no-return-assign': 0,
		'no-param-reassign': 0,
		'no-tabs': 0,
		'no-multi-spaces': 2,
		'no-eval': 2,
		'no-extend-native': 2,
		'no-multi-str': 2,
		'no-use-before-define': 2,
		'no-const-assign': 2,
		'no-cond-assign': 2,
		'no-constant-condition': 2,
		'no-control-regex': 2,
		'no-debugger': 2,
		'no-delete-var': 2,
		'no-dupe-keys': 2,
		'no-dupe-args': 2,
		'no-dupe-class-members': 2,
		'no-duplicate-case': 2,
		'no-else-return': [0, { allowElseIf: true }],
		'no-empty': 2,
		'no-empty-character-class': 2,
		'no-ex-assign': 2,
		'no-extra-boolean-cast': 2,
		'no-extra-semi': 2,
		'no-fallthrough': 2,
		'no-func-assign': 2,
		'no-inner-declarations': [2, 'functions'],
		'no-invalid-regexp': 2,
		'no-irregular-whitespace': 2,
		'no-mixed-spaces-and-tabs': 1,
		'no-sparse-arrays': 2,
		'no-negated-in-lhs': 2,
		'no-obj-calls': 2,
		'no-octal': 2,
		'no-redeclare': 2,
		'no-regex-spaces': 2,
		'no-undef': 2,
		'no-unreachable': 2,
		'no-unused-expressions': 0,
		'no-unused-vars': 'off',
		'max-len': 0,
		'react/jsx-uses-vars': 2,
		'no-void': 2,
		'no-var': 2,
		'one-var': [2, 'never'],
		'no-lonely-if': 2,
		'no-trailing-spaces': 2,
		complexity: [1, 31],
		'space-in-parens': [2, 'never'],
		'space-before-blocks': [2, 'always'],
		indent: 'off',
		'eol-last': [2, 'always'],
		'comma-dangle': [2, 'never'],
		'keyword-spacing': 2,
		'block-spacing': 2,
		'brace-style': [2, '1tbs', { allowSingleLine: true }],
		'computed-property-spacing': 2,
		'comma-spacing': 2,
		'comma-style': 2,
		'guard-for-in': 2,
		'wrap-iife': 2,
		'block-scoped-var': 2,
		curly: [2, 'all'],
		eqeqeq: [2, 'allow-null'],
		'new-cap': 'off',
		'use-isnan': 2,
		'valid-typeof': 2,
		'linebreak-style': 0,
		'prefer-template': 2,
		quotes: [1, 'single'],
		semi: [2, 'always'],
		'prefer-const': 2,
		'object-shorthand': 2,
		'consistent-return': 0,
		'global-require': 'off',
		'react-native/no-unused-styles': 2,
		'react/jsx-one-expression-per-line': 0,
		'require-await': 2,
		'func-names': 0,
		'react/static-property-placement': [0],
		'arrow-parens': ['warn', 'as-needed', { requireForBlockBody: true }],
		'react/jsx-curly-newline': [0],
		'react/state-in-constructor': [0],
		'no-async-promise-executor': [0],
		'max-classes-per-file': [0],
		'no-multiple-empty-lines': [0],
		'no-sequences': 'off',
		'react-hooks/rules-of-hooks': 'error',
		'react-hooks/exhaustive-deps': 'warn'
	},
	globals: {
		__DEV__: true
	},
	overrides: [
		{
			files: ['**/*.ts', '**/*.tsx'],
			extends: [
				'plugin:@typescript-eslint/recommended',
				'plugin:@typescript-eslint/eslint-recommended',
				'@rocket.chat/eslint-config',
				'prettier'
			],
			parser: '@typescript-eslint/parser',
			parserOptions: {
				sourceType: 'module',
				ecmaVersion: 2018,
				warnOnUnsupportedTypeScriptVersion: false,
				ecmaFeatures: {
					experimentalObjectRestSpread: true,
					legacyDecorators: true
				}
			},
			plugins: ['react', '@typescript-eslint'],
			rules: {
				'@typescript-eslint/no-var-requires': 'off',
				'@typescript-eslint/no-empty-function': [0],
				'@typescript-eslint/ban-types': [0],
				'func-call-spacing': 'off',
				'jsx-quotes': ['error', 'prefer-single'],
				indent: 'off',
				'comma-dangle': [2, 'never'],
				'no-return-assign': 0,
				'no-dupe-class-members': 'off',
				'no-extra-parens': 'off',
				'no-spaced-func': 'off',
				'no-unused-vars': 'off',
				'no-useless-constructor': 'off',
				'no-use-before-define': 'off',
				'react/jsx-uses-react': 'error',
				'react/jsx-uses-vars': 'error',
				'react/jsx-no-undef': 'error',
				'react/jsx-fragments': ['error', 'syntax'],
				'@typescript-eslint/ban-ts-comment': 'off',
				'@typescript-eslint/indent': [
					'warn',
					'tab',
					{
						SwitchCase: 1
					}
				],
				'@typescript-eslint/no-extra-parens': [
					'warn',
					'all',
					{
						conditionalAssign: true,
						nestedBinaryExpressions: false,
						returnAssign: true,
						ignoreJSX: 'all',
						enforceForArrowConditionals: false
					}
				],
				'@typescript-eslint/no-dupe-class-members': 'error',
				'@typescript-eslint/no-explicit-any': 'off',
				'@typescript-eslint/no-unused-vars': [
					'error',
					{
						argsIgnorePattern: '^_',
						ignoreRestSiblings: true
					}
				],
				'new-cap': 'off',
				'lines-between-class-members': 'off',
				'react-hooks/rules-of-hooks': 'error',
				'react-hooks/exhaustive-deps': 'warn'
			},
			globals: {
				JSX: true
			},
			settings: {
				'import/resolver': {
					node: {
						extensions: ['.js', '.ts', '.tsx']
					}
				}
			}
		},
		{
			files: ['e2e/**'],
			globals: {
				by: true,
				detox: true,
				device: true,
				element: true,
				waitFor: true
			},
			rules: {
				'import/no-extraneous-dependencies': 0,
				'no-await-in-loop': 0,
				'no-restricted-syntax': 0,
				// TODO: remove this rule when update Detox to 20 and test if the namespace Detox is available
				'no-undef': 1
			}
		}
	]
};