import { execFileSync } from "node:child_process";
import pg from "pg";

/**
 * Prepara la base de pruebas: la crea si no existe, la deja vacía, aplica las migraciones
 * con `prisma migrate deploy` y ejecuta el seed DOS veces (comprueba que es idempotente).
 *
 * Solo opera sobre una base cuyo nombre termina en "_test", para no tocar nunca otra.
 */
const TEST_DATABASE_URL =
  process.env.TEST_DATABASE_URL ??
  "postgresql://chesco:chesco_dev@localhost:5432/chesco_test?schema=public";

export default async function setup(): Promise<void> {
  const url = new URL(TEST_DATABASE_URL);
  const dbName = url.pathname.replace(/^\//, "");
  if (!dbName.endsWith("_test")) {
    throw new Error(`La base de pruebas debe terminar en "_test" (recibido: ${dbName}).`);
  }

  const adminUrl = new URL(TEST_DATABASE_URL);
  adminUrl.pathname = "/postgres";
  adminUrl.search = "";
  const admin = new pg.Client({ connectionString: adminUrl.toString() });
  await admin.connect();
  const exists = await admin.query("SELECT 1 FROM pg_database WHERE datname = $1", [dbName]);
  if (exists.rowCount === 0) await admin.query(`CREATE DATABASE "${dbName}"`);
  await admin.end();

  const testUrl = new URL(TEST_DATABASE_URL);
  testUrl.search = "";
  const client = new pg.Client({ connectionString: testUrl.toString() });
  await client.connect();
  await client.query("DROP SCHEMA IF EXISTS public CASCADE");
  await client.query("CREATE SCHEMA public");
  await client.end();

  const env: NodeJS.ProcessEnv = {
    ...process.env,
    DATABASE_URL: TEST_DATABASE_URL,
    NODE_ENV: "test",
    SEED_ADMIN_EMAIL: "",
    SEED_DEMO_DATA: "false",
  };
  execFileSync("npx", ["prisma", "migrate", "deploy"], { env, stdio: "pipe" });
  execFileSync("npx", ["tsx", "prisma/seed.ts"], { env, stdio: "pipe" });
  execFileSync("npx", ["tsx", "prisma/seed.ts"], { env, stdio: "pipe" });
}
