import js from "@eslint/js";
import globals from "globals";

/**
 * Config ESLint « flat » (ESLint 9).
 *
 * Trois environnements coexistent dans ce repo et n'ont pas les mêmes globales :
 *  - apps/api        : Node ESM
 *  - apps/web/site   : scripts classiques navigateur (Leaflet en global)
 *  - apps/admin/site : scripts classiques navigateur
 */
export default [
  {
    ignores: [
      "**/node_modules/**",
      "apps/web/quizz-site/**",
      "reports/**",
      ".stryker-tmp/**",
      "coverage/**",
    ],
  },

  js.configs.recommended,

  // ---- API : Node, ESM ----
  {
    files: ["apps/api/src/**/*.js"],
    languageOptions: {
      ecmaVersion: 2023,
      sourceType: "module",
      globals: { ...globals.node },
    },
    rules: {
      "no-unused-vars": ["error", { argsIgnorePattern: "^_", caughtErrors: "none" }],
      "no-console": "off",
      eqeqeq: ["error", "smart"],
      "prefer-const": "error",
      "no-var": "error",
      "no-throw-literal": "error",
      "require-await": "warn",
    },
  },

  // ---- Tests (vitest + Playwright). Certains tournent sous jsdom ou dans un
  // navigateur → globales navigateur en plus de Node. Le harnais e2e est en
  // .mjs (modules ES chargés directement par node). ----
  {
    files: ["apps/*/test/**/*.{js,mjs}"],
    languageOptions: {
      ecmaVersion: 2023,
      sourceType: "module",
      globals: { ...globals.node, ...globals.browser },
    },
    rules: {
      "no-unused-vars": ["error", { argsIgnorePattern: "^_", caughtErrors: "none" }],
    },
  },

  // ---- Frontends : scripts classiques navigateur ----
  {
    files: ["apps/web/site/**/*.js", "apps/admin/site/**/*.js"],
    languageOptions: {
      ecmaVersion: 2023,
      sourceType: "script",
      globals: {
        ...globals.browser,
        // Chargés via <script> (CDN ou fichier local) avant app.js
        L: "readonly",
        LOCALES: "readonly",
        noUiSlider: "readonly",
        BMPure: "readonly",
        // Footer CJS des modules « purs » partagés navigateur/test
        module: "writable",
      },
    },
    rules: {
      "no-unused-vars": ["error", { argsIgnorePattern: "^_", caughtErrors: "none" }],
      // `try { … } catch {}` volontaire sur les appels best-effort (logout, télémétrie)
      "no-empty": ["error", { allowEmptyCatch: true }],
      "no-console": ["warn", { allow: ["warn", "error"] }],
      eqeqeq: ["error", "smart"],
      "prefer-const": "error",
      "no-var": "error",
      // Les frontends déclarent volontairement des globales partagées entre fichiers
      "no-redeclare": ["error", { builtinGlobals: false }],
    },
  },

  // ---- Traductions : les espaces insécables fines sont de la typographie
  // volontaire (français, tchèque…), pas des caractères parasites. ----
  {
    files: ["apps/web/site/locales.js"],
    rules: { "no-irregular-whitespace": "off" },
  },

  // ---- Config et scripts d'outillage (racine + scripts/) ----
  {
    files: ["*.js", "*.config.js", "scripts/**/*.{js,mjs}"],
    languageOptions: {
      ecmaVersion: 2023,
      sourceType: "module",
      globals: { ...globals.node },
    },
    rules: {
      "no-unused-vars": ["error", { argsIgnorePattern: "^_", caughtErrors: "none" }],
      "no-console": "off",
    },
  },
];
