import { defineConfig, globalIgnores } from 'eslint/config';
import nextVitals from 'eslint-config-next/core-web-vitals';
import nextTs from 'eslint-config-next/typescript';

const eslintConfig = defineConfig([
  // Ignores MUST come first so they apply to every subsequent
  // config item. globalIgnores() at the bottom of the array works
  // for *.next / out / build / next-env.d.ts because eslint-config-
  // next handles those internally, but .pnpmfile.cjs is not in that
  // default list — declaring an explicit `{ ignores: [...] }` block
  // at index 0 is the documented way to make eslint v9 skip files
  // entirely before any config rules apply.
  {
    ignores: ['**/.pnpmfile.cjs', '**/*.cjs'],
  },
  ...nextVitals,
  ...nextTs,
  {
    rules: {
      'react-hooks/set-state-in-effect': 'off',
      '@typescript-eslint/no-unused-vars': [
        'warn',
        { argsIgnorePattern: '^_', varsIgnorePattern: '^_', caughtErrorsIgnorePattern: '^_' },
      ],
    },
  },
  // UX-drift ratchet (UX-1): shared `@bytelyst/ui` primitives must be adopted
  // through the local adapter `src/components/ui/Primitives.tsx`, never imported
  // directly into pages/components. This keeps product-specific variants, the
  // `--bl-*` token bridge, and a single migration seam in one place (the
  // exception below). Mirrors tracker-web's convention.
  {
    rules: {
      'no-restricted-imports': [
        'error',
        {
          paths: [
            {
              name: '@bytelyst/ui',
              message:
                "Import shared UI primitives via '@/components/ui/Primitives' instead of '@bytelyst/ui' directly (UX-drift ratchet — see docs/roadmaps/UX_INTEGRATION_ADMIN.md).",
            },
          ],
          patterns: [
            {
              group: ['@bytelyst/ui/*'],
              message:
                "Import shared UI primitives via '@/components/ui/Primitives' instead of '@bytelyst/ui/*' directly (UX-drift ratchet — see docs/roadmaps/UX_INTEGRATION_ADMIN.md).",
            },
          ],
        },
      ],
    },
  },
  // The Primitives adapter is the ONE sanctioned seam for `@bytelyst/ui`.
  {
    files: ['src/components/ui/Primitives.tsx'],
    rules: {
      'no-restricted-imports': 'off',
    },
  },
  // Override default ignores of eslint-config-next.
  globalIgnores([
    // Default ignores of eslint-config-next:
    '.next/**',
    'out/**',
    'build/**',
    'next-env.d.ts',
    // .pnpmfile.cjs is a pnpm install hook (CommonJS by design).
    // The TypeScript no-require-imports rule would otherwise flag
    // every require() call in this file. eslint-config-next does NOT
    // ignore .cjs by default.
    '.pnpmfile.cjs',
    '**/*.cjs',
  ]),
]);

export default eslintConfig;
