import assert from "node:assert/strict";
import { readFileSync } from "node:fs";
import postgres from "postgres";

import { loginBrowser, requireOperatorPassword } from "./auth.js";
import { approvedJourneyEnvironment, requiredEnvironment } from "./exact-journey.js";

const webUrl = requiredEnvironment(process.env, "AWP_WEB_URL");
const databaseUrl = requiredEnvironment(process.env, "AWP_TEST_POSTGRES_URL");
const repositoryUrl = requiredEnvironment(process.env, "AWP_REPOSITORY_REMOTE_URL");
const goliveFile = requiredEnvironment(process.env, "AWP_ACCEPTANCE_STATE_FILE");
const playwrightModule = requiredEnvironment(process.env, "AWP_PLAYWRIGHT_MODULE");
const operatorPassword = requireOperatorPassword();
const { projectId, factoryRunId } = approvedJourneyEnvironment();

const criteria = [...readFileSync(goliveFile, "utf8").matchAll(/^- \[([ xX])\] AC-\d+:/gmu)];
const checked = criteria.filter((match) => match[1]?.toLowerCase() === "x").length;
const total = criteria.length;
assert.equal(total, 30);

const sql = postgres(databaseUrl, { max: 1 });
try {
  const projects = await sql<{ repository_url: string }[]>`
    select repository_url from projects where id = ${projectId}
  `;
  assert.deepEqual(projects, [{ repository_url: repositoryUrl }]);
  const runs = await sql<{ project_id: string }[]>`
    select project_id from factory_runs where id = ${factoryRunId}
  `;
  assert.deepEqual(runs, [{ project_id: projectId }]);
} finally {
  await sql.end({ timeout: 5 });
}

const { chromium } = await import(playwrightModule);
const browser = await chromium.launch({ headless: true });
try {
  const page = await browser.newPage();
  await loginBrowser(page, webUrl, operatorPassword);
  await page.goto(`${webUrl}/projects/${encodeURIComponent(projectId)}`, {
    waitUntil: "networkidle",
  });
  const progress = page.locator("[data-golive-progress]");
  await progress.waitFor();
  await progress.getByText(`${checked} / ${total}`, { exact: true }).waitFor();
  assert.equal(await progress.locator("progress").getAttribute("value"), String(checked));
  assert.equal(await progress.locator("progress").getAttribute("max"), String(total));
  process.stdout.write(
    `AC-30 PASS: exact AWP Project ${projectId} for FactoryRun ${factoryRunId} renders binding GOLIVE fraction ${checked} / ${total}\n`,
  );
} finally {
  await browser.close();
}
