import { defineConfig, globalIgnores } from 'eslint/config'
import globals from 'globals'
import js from '@eslint/js'
import eslintPluginAstro from 'eslint-plugin-astro'
import sveltePlugin from 'eslint-plugin-svelte'
import astroParser from 'astro-eslint-parser'
import svelteParser from 'svelte-eslint-parser'

export default defineConfig([
  globalIgnores([
    '**/.DS_Store',
    '**/node_modules',
    'build',
    '**/.svelte-kit',
    '**/.env',
    '**/.env.*',
    '**/yarn.lock',
    'src/components/HeadAnalytic.astro'
  ]),
  js.configs.recommended,
  eslintPluginAstro.configs.recommended,
  sveltePlugin.configs.recommended,
  {
    languageOptions: {
      sourceType: 'module',
      ecmaVersion: 'latest',
      parserOptions: {
        projectService: true,
        extraFileExtensions: ['.astro']
      },
      globals: {
        ...globals.browser,
        ...globals.node
      }
    },
    rules: {
      'array-bracket-spacing': 2,

      'brace-style': [
        2,
        '1tbs',
        {
          allowSingleLine: true
        }
      ],

      camelcase: [
        2,
        {
          properties: 'never',
          ignoreDestructuring: false
        }
      ],

      'comma-dangle': [2, 'never'],

      'comma-spacing': [
        2,
        {
          before: false,
          after: true
        }
      ],

      'comma-style': [2, 'last'],
      'computed-property-spacing': 2,
      'consistent-return': 2,
      'consistent-this': [2, 'self'],
      curly: [2, 'multi-line', 'consistent'],
      'eol-last': 2,
      eqeqeq: [2, 'allow-null'],

      'func-style': [
        2,
        'expression',
        {
          allowArrowFunctions: true
        }
      ],

      'guard-for-in': 2,
      'handle-callback-err': [2, '^(err|error)$'],

      'key-spacing': [
        0,
        {
          align: 'value'
        }
      ],

      'keyword-spacing': [
        2,
        {
          before: true,
          after: true
        }
      ],

      'new-cap': [
        2,
        {
          capIsNew: false,
          newIsCap: true
        }
      ],

      'new-parens': 0,
      'no-bitwise': 0,
      'no-cond-assign': 2,
      'no-console': 2,
      'no-constant-condition': 2,
      'no-debugger': 2,
      'no-delete-var': 2,
      'no-dupe-keys': 2,
      'no-duplicate-case': 2,
      'no-empty': 2,
      'no-empty-character-class': 2,
      'no-eval': 2,
      'no-ex-assign': 2,
      'no-extend-native': 2,
      'no-extra-parens': [2, 'functions'],
      'no-extra-semi': 2,
      'no-floating-decimal': 2,
      'no-func-assign': 2,
      'no-implied-eval': 2,
      'no-inner-declarations': 2,
      'no-invalid-regexp': 2,
      'no-irregular-whitespace': 2,
      'no-iterator': 2,
      'no-labels': 2,
      'no-lonely-if': 2,
      'no-loop-func': 2,
      'no-mixed-requires': 2,
      'no-mixed-spaces-and-tabs': 2,
      'no-multi-spaces': 2,

      'no-multiple-empty-lines': [
        2,
        {
          max: 1,
          maxEOF: 0,
          maxBOF: 0
        }
      ],

      'no-native-reassign': 2,
      'no-negated-in-lhs': 2,
      'no-new-func': 2,
      'no-new-object': 2,
      'no-new-require': 2,
      'no-new-wrappers': 2,
      'no-obj-calls': 2,
      'no-octal': 2,
      'no-path-concat': 2,
      'no-plusplus': 0,
      'no-proto': 2,
      'no-redeclare': 2,
      'no-return-assign': 2,
      'no-self-compare': 2,
      'no-sequences': 2,
      'no-shadow': 2,
      'no-spaced-func': 2,
      'no-sparse-arrays': 2,
      'no-throw-literal': 2,
      'no-trailing-spaces': 2,
      'no-undef': 2,
      'no-undef-init': 2,
      'no-undefined': 2,
      'no-underscore-dangle': 0,
      'no-unreachable': 2,
      'no-unused-expressions': 2,

      'no-unused-vars': [
        2,
        {
          vars: 'all',
          args: 'after-used',
          argsIgnorePattern: '^_',
          caughtErrorsIgnorePattern: '^_'
        }
      ],

      'no-use-before-define': [2, 'nofunc'],
      'no-var': 2,

      'no-warning-comments': [
        2,
        {
          terms: ['todo', 'fixme']
        }
      ],

      'object-curly-spacing': [2, 'always'],
      'padded-blocks': [2, 'never'],
      'quote-props': [0, 'as-needed'],

      quotes: [
        2,
        'single',
        {
          avoidEscape: true,
          allowTemplateLiterals: false
        }
      ],

      radix: 0,
      semi: [2, 'never'],

      'semi-spacing': [
        2,
        {
          before: false,
          after: true
        }
      ],

      'space-before-blocks': [2, 'always'],

      'space-before-function-paren': [
        2,
        {
          anonymous: 'never',
          named: 'never',
          asyncArrow: 'always'
        }
      ],

      'space-in-parens': [2, 'never'],
      'space-infix-ops': 2,

      'space-unary-ops': [
        2,
        {
          words: true,
          nonwords: false
        }
      ],

      strict: [2, 'never'],
      'use-isnan': 2,
      'valid-typeof': 2,
      'vars-on-top': 0,
      'wrap-iife': [2, 'inside'],
      yoda: 0
    }
  },
  {
    files: ['**/*.svelte'],
    languageOptions: {
      parser: svelteParser
    }
  },
  {
    files: ['**/*.astro'],
    languageOptions: {
      globals: {
        ...globals.browser,
        ...globals.node
      },
      parser: astroParser
    },

    rules: {
      'astro/no-unused-css-selector': 2
    }
  }
])
