import Fastify from "fastify";
import cookie from "@fastify/cookie";
import { makeFakePool } from "./fakePool.js";

/**
 * Applications de test partagées.
 *
 * Construire une app Fastify coûte ~14 ms (helmet + cookie + rate-limit +
 * ready()). C'est négligeable une fois, mais les tests de mutation rejouent la
 * suite des milliers de fois : à raison d'une construction par cas de test, ces
 * 14 ms devenaient l'essentiel des 5 minutes du run.
 *
 * On construit donc l'app UNE fois par fichier, autour d'un pool reconfigurable
 * (`pool.reset(handlers)`), et chaque test ne fait que reprogrammer le pool.
 *
 * Une app par fichier de test (et non une globale partagée) : les fichiers
 * s'exécutent dans des workers séparés, et l'isolation reste totale puisque le
 * seul état mutable est le pool, remis à zéro avant chaque cas.
 */

/** App n'exposant que les routes admin (plugin adminRoutes seul). */
export async function createAdminApp() {
  const { default: adminRoutes } = await import("../../src/adminRoutes.js");
  const pool = makeFakePool();
  const app = Fastify({ logger: false });
  await app.register(cookie);
  await app.register(adminRoutes, { pool });
  await app.ready();
  return { app, pool };
}

/** App complète (routes publiques + admin), via la fabrique de production. */
export async function createFullApp(opts = {}) {
  const { buildServer } = await import("../../src/app.js");
  const pool = makeFakePool();
  const app = await buildServer({
    pool,
    logger: false,
    corsOrigins: ["https://metalfrom.eu"],
    seedAdmin: false,
    // L'app est partagée entre les cas du fichier : les plafonds de débit
    // réels rendraient le 11e test rouge sans rapport avec ce qu'il vérifie.
    // Les vraies valeurs sont testées dans rateLimit.test.js.
    globalRateLimitMax: 1e9,
    adminRateLimitMax: 1e9,
    authRateLimitMax: 1e9,
    ...opts,
  });
  return { app, pool };
}

/**
 * Quelques cas doivent construire leur propre app (options de fabrique
 * différentes : jeton d'import absent, pool null…). Ils restent rares et
 * assument le coût de construction.
 */
export async function createFullAppWith(opts) {
  const { buildServer } = await import("../../src/app.js");
  return buildServer({
    logger: false,
    corsOrigins: ["https://metalfrom.eu"],
    seedAdmin: false,
    ...opts,
  });
}
