import { defineConfig, devices } from "@playwright/test";
import path from "node:path";

/**
 * Parcours de bout en bout du dashboard admin.
 *
 * Le serveur de test (apps/admin/test/e2e/server.mjs) reproduit la topologie de
 * production — statique servi + `/admin/*` proxifié vers la VRAIE application
 * Fastify — avec un faux pool à la place de Postgres. Démarrage ~1 s, aucun
 * conteneur, conformément au principe suivi par le reste de la suite.
 *
 * Performance : les scénarios tournent en parallèle et partagent une session
 * enregistrée une fois par le projet `setup`. Ils ne se marchent pas dessus car
 * aucun ne reprogramme le faux pool : les variations de données passent par
 * `page.route`, qui est propre à chaque onglet.
 */
const PORT = Number(process.env.E2E_PORT || 4319);
const STORAGE_STATE = path.join(process.cwd(), "node_modules/.cache/playwright/admin-auth.json");

export default defineConfig({
  testDir: "apps/admin/test/e2e",
  fullyParallel: true,
  workers: process.env.CI ? 2 : 4,
  forbidOnly: !!process.env.CI,
  retries: 0,
  reporter: [["list", { printSteps: false }]],
  timeout: 15000,
  expect: { timeout: 5000 },
  outputDir: "node_modules/.cache/playwright/results",

  use: {
    baseURL: `http://127.0.0.1:${PORT}`,
    trace: "retain-on-failure",
    screenshot: "only-on-failure",
    video: "off",
  },

  projects: [
    { name: "setup", testMatch: /auth\.setup\.js/ },
    {
      name: "chromium",
      testMatch: /.*\.spec\.js/,
      use: { ...devices["Desktop Chrome"], storageState: STORAGE_STATE },
      dependencies: ["setup"],
    },
  ],

  webServer: {
    command: "node apps/admin/test/e2e/server.mjs",
    url: `http://127.0.0.1:${PORT}/`,
    env: { E2E_STANDALONE: "1", E2E_PORT: String(PORT) },
    reuseExistingServer: !process.env.CI,
    timeout: 30000,
    stdout: "ignore",
    stderr: "pipe",
  },
});
