import baseConfig, { compat } from './eslint.base.config.js';
import globals from 'globals';

export default [
  ...baseConfig,
  {
    files: ['**/*.ts', '**/*.tsx', '**/*.js', '**/*.jsx'],
    rules: {
      '@nx/enforce-module-boundaries': [
        'error',
        {
          enforceBuildableLibDependency: true,
          allow: [],
          depConstraints: [
            {
              sourceTag: 'type:plugin',
              onlyDependOnLibsWithTags: [
                'type:util',
                'type:ui',
                'type:feature',
              ],
            },
            {
              sourceTag: 'type:app',
              onlyDependOnLibsWithTags: [
                'type:util',
                'type:ui',
                'type:feature',
              ],
            },
            {
              sourceTag: 'type:feature',
              onlyDependOnLibsWithTags: [
                'type:feature',
                'type:ui',
                'type:util',
              ],
            },
            {
              sourceTag: 'type:ui',
              onlyDependOnLibsWithTags: ['type:ui', 'type:util'],
            },
            {
              sourceTag: 'type:util',
              onlyDependOnLibsWithTags: ['type:util'],
            },
          ],
        },
      ],
    },
    languageOptions: {
      globals: {
        penpot: 'readonly',
        repairIntrinsics: 'readonly',
        hardenIntrinsics: 'readonly',
        Compartment: 'readonly',
        harden: 'readonly',
      }
    }
  },
  ...compat
    .config({
      extends: [
        'plugin:@typescript-eslint/recommended',
        'plugin:@typescript-eslint/recommended-requiring-type-checking',
        'plugin:deprecation/recommended',
        'prettier',
      ],
    })
    .map((config) => ({
      ...config,
      files: ['**/*.ts', '**/*.tsx'],
      rules: {
        '@typescript-eslint/no-unused-vars': ['error'],
        'no-multiple-empty-lines': [2, { max: 1 }],
        quotes: ['error', 'single', { avoidEscape: true }],
        'no-unused-vars': 'off',
        '@typescript-eslint/no-unused-vars': ['error']
      },
    })),
  ...compat
    .config({
      extends: [
        'plugin:@typescript-eslint/recommended',
        'plugin:@typescript-eslint/recommended-requiring-type-checking',
        'plugin:deprecation/recommended',
        'prettier',
      ],
    })
    .map((config) => ({
      ...config,
      files: ['**/*.spec.ts'],
      rules: {
        '@typescript-eslint/no-unused-vars': ['error'],
        'no-multiple-empty-lines': [2, { max: 1 }],
        quotes: ['error', 'single', { avoidEscape: true }],
        '@typescript-eslint/no-unsafe-member-access': 'off',
        '@typescript-eslint/no-unsafe-call': 'off',
        '@typescript-eslint/no-unsafe-assignment': 'off',
        '@typescript-eslint/no-explicit-any': 'off',
        '@typescript-eslint/no-unsafe-argument': 'off',
        '@typescript-eslint/no-unsafe-return': 'off',
        '@ngrx/prefix-selectors-with-select': 'off',
      },
      languageOptions: {
        globals: {
          ...globals.jest
        }
      },
    })),
  {
    files: ['**/*.js', '**/*.jsx'],
    rules: {},
  }
];