import js from '@eslint/js';
import ts from 'typescript-eslint';
import prettier from 'eslint-config-prettier';
import globals from 'globals';

/**
 * Flat-config ESLint for the Playwright TypeScript suite. Prettier owns formatting (its config is
 * last so it disables every stylistic rule). The rules kept here catch real test bugs — unused
 * setup, floating promises that make a test race, `any` that hides a wrong assertion shape.
 */
export default ts.config(
  js.configs.recommended,
  ...ts.configs.recommended,
  prettier,
  {
    languageOptions: {
      globals: { ...globals.node },
    },
  },
  {
    rules: {
      '@typescript-eslint/no-unused-vars': [
        'error',
        { argsIgnorePattern: '^_', varsIgnorePattern: '^_', caughtErrorsIgnorePattern: '^_' },
      ],
      // A floating promise in a test is a real hazard: an un-awaited request or assertion can let
      // the test end before it runs, passing vacuously. Keep it on.
      '@typescript-eslint/no-floating-promises': 'error',
      // Off for the suite: this is all test code, where `any` is the honest type for an untyped
      // `res.json()` body or a `page.evaluate()` return. Threading DTO types through every
      // assertion is churn that buys nothing — the assertion values are what's checked, not the
      // static shape. (no-floating-promises and no-unused-vars, which catch real test bugs, stay on.)
      '@typescript-eslint/no-explicit-any': 'off',
      // Off: Playwright fixtures with no dependencies are declared `async ({}, use) => {}` — the
      // empty destructure is required by the fixtures API, not an accident.
      'no-empty-pattern': 'off',
    },
  },
  {
    languageOptions: {
      parserOptions: { projectService: true },
    },
  },
  {
    ignores: [
      'node_modules/',
      'playwright-report/',
      'test-results/',
      '*.config.js',
      // Standalone dev/load-test scripts, run directly with `node`. They are not part of the
      // Playwright tsconfig project, so `projectService: true` cannot type them and every one of
      // them failed with "was not found by the project service" — which meant `npm run lint` had
      // been exiting non-zero on main, i.e. the e2e lint gate was not gating at all.
      //
      // Ignoring is the honest fix rather than widening the tsconfig: these are throwaway harness
      // scripts, and the type-aware rules that justify the project service (no-floating-promises)
      // exist to protect TEST code.
      '*.mjs',
      'loadtest/',
    ],
  }
);
