import type {Config} from '../config'
import type {OptionsOverrides} from '../options'
import {requireOf} from '../require-of'
import {interopDefault} from '../utils'
import {fallback} from './fallback'

export type UnicornOptions = OptionsOverrides

export async function unicorn(options: UnicornOptions = {}): Promise<Config[]> {
  const {overrides = {}} = options

  return requireOf(
    ['eslint-plugin-unicorn'],
    async () => {
      const pluginUnicorn = await interopDefault(import('eslint-plugin-unicorn'))
      return [
        {
          name: '@bfra.me/unicorn',
          plugins: {
            unicorn: pluginUnicorn,
          },
          rules: {
            'unicorn/catch-error-name': 'error',
            'unicorn/filename-case': [
              'error',
              {
                cases: {kebabCase: true, pascalCase: true},
                ignore: [/^[A-Z]+\..*$/, /import_map\.json/],
              },
            ],
            'unicorn/consistent-empty-array-spread': 'error',
            'unicorn/consistent-existence-index-check': 'error',
            'unicorn/consistent-function-scoping': ['error', {checkArrowFunctions: false}],
            'unicorn/error-message': 'error',
            'unicorn/escape-case': 'error',
            'unicorn/new-for-builtins': 'error',
            'unicorn/no-array-method-this-argument': 'error',
            'unicorn/no-array-push-push': 'error',
            'unicorn/no-await-in-promise-methods': 'error',
            'unicorn/no-console-spaces': 'error',
            'unicorn/no-for-loop': 'error',
            'unicorn/no-hex-escape': 'error',
            'unicorn/no-instanceof-array': 'error',
            'unicorn/no-invalid-remove-event-listener': 'error',
            'unicorn/no-lonely-if': 'error',
            'unicorn/no-negated-condition': 'error',
            'unicorn/no-negation-in-equality-check': 'error',
            'unicorn/no-new-array': 'error',
            'unicorn/no-new-buffer': 'error',
            'unicorn/no-single-promise-in-promise-methods': 'error',
            'unicorn/no-static-only-class': 'error',
            'unicorn/no-typeof-undefined': 'error',
            'unicorn/no-unnecessary-await': 'error',
            'unicorn/no-zero-fractions': 'error',
            'unicorn/number-literal-case': 'error',
            'unicorn/prefer-add-event-listener': 'error',
            'unicorn/prefer-array-find': 'error',
            'unicorn/prefer-array-flat-map': 'error',
            'unicorn/prefer-array-index-of': 'error',
            'unicorn/prefer-array-some': 'error',
            'unicorn/prefer-at': 'error',
            'unicorn/prefer-blob-reading-methods': 'error',
            'unicorn/prefer-date-now': 'error',
            'unicorn/prefer-dom-node-append': 'error',
            'unicorn/prefer-dom-node-dataset': 'error',
            'unicorn/prefer-dom-node-remove': 'error',
            'unicorn/prefer-dom-node-text-content': 'error',
            'unicorn/prefer-includes': 'error',
            'unicorn/prefer-keyboard-event-key': 'error',
            'unicorn/prefer-math-min-max': 'error',
            'unicorn/prefer-math-trunc': 'error',
            'unicorn/prefer-modern-dom-apis': 'error',
            'unicorn/prefer-modern-math-apis': 'error',
            'unicorn/prefer-negative-index': 'error',
            'unicorn/prefer-node-protocol': 'error',
            'unicorn/prefer-number-properties': 'error',
            'unicorn/prefer-optional-catch-binding': 'error',
            'unicorn/prefer-prototype-methods': 'error',
            'unicorn/prefer-query-selector': 'error',
            'unicorn/prefer-reflect-apply': 'error',
            'unicorn/prefer-regexp-test': 'error',
            'unicorn/prefer-string-raw': 'error',
            'unicorn/prefer-string-replace-all': 'error',
            'unicorn/prefer-string-slice': 'error',
            'unicorn/prefer-string-starts-ends-with': 'error',
            'unicorn/prefer-string-trim-start-end': 'error',
            'unicorn/prefer-type-error': 'error',
            'unicorn/throw-new-error': 'error',

            ...overrides,
          },
        },
      ]
    },
    fallback,
  )
}
