import dotenv from "dotenv";

const ENV_TEST_PATH = ".env.test";

// vitest.config.ts already loads .env.test with override:true; we reload here so
// the setup file is self-contained when run directly.
dotenv.config({ path: ENV_TEST_PATH });

/**
 * Safety guard: the suite hits a REAL MySQL database (no Prisma mocks) and
 * MUTATES it, so it must never run against a dev/production DB. We require the
 * configured database name to contain "test" (the committed `.env.test` points
 * at the throwaway `app_test`); anything else is a HARD FAILURE before any test
 * runs, so a stray DATABASE_URL can't silently corrupt dev/prod data.
 */
function extractDbName(url: string | undefined): string | null {
  if (!url) return null;
  try {
    // mysql://user:pass@host:3306/dbname?params  → "dbname"
    const afterAuthority = url.replace(/^[a-z]+:\/\/[^/]+\//i, "");
    const dbName = afterAuthority.split("?")[0].split("/")[0];
    return dbName || null;
  } catch {
    return null;
  }
}

const dbUrl = process.env.DATABASE_URL;
const dbName = extractDbName(dbUrl);

if (!dbUrl) {
  throw new Error(
    "[test-setup] DATABASE_URL is not set. The suite mutates a real database — " +
      `point ${ENV_TEST_PATH} at a dedicated TEST database (e.g. app_test).`,
  );
}

if (dbName == null || !/test/i.test(dbName)) {
  throw new Error(
    `[test-setup] Refusing to run: DATABASE_URL targets database "${dbName ?? "unknown"}", ` +
      `whose name does not contain "test". The suite mutates the database — point ` +
      `${ENV_TEST_PATH} at a throwaway TEST database (e.g. app_test), never dev/production.`,
  );
}
