import assert from "node:assert/strict";

export const TEST_OPERATOR_PASSWORD = "awp-test-password";
export const TEST_OPERATOR_PASSWORD_HASH =
  "$argon2id$v=19$m=4096,t=1,p=1$Ck40vfEDgiKQLTypU7q/Aw$yXWnK44gWuPM+zdnRSNBq4WbaLVdKlBMm5dT2VY8bOU";

export function requireOperatorPassword(
  environment: Readonly<Record<string, string | undefined>> = process.env,
): string {
  const password = environment.AWP_OPERATOR_PASSWORD;
  if (!password) throw new Error("AWP_OPERATOR_PASSWORD is required for authenticated GOLIVE");
  return password;
}

export async function createOperatorSession(
  controlPlaneUrl: string,
  password: string,
): Promise<string> {
  const response = await fetch(`${controlPlaneUrl}/internal/auth/sessions`, {
    method: "POST",
    headers: { "content-type": "application/json" },
    body: JSON.stringify({ password, userAgent: "awp-golive" }),
  });
  const payload = (await response.json()) as { token?: unknown; error?: unknown };
  assert.equal(
    response.status,
    201,
    `operator login failed: ${response.status} ${JSON.stringify(payload)}`,
  );
  assert.equal(typeof payload.token, "string");
  assert.ok(payload.token);
  return payload.token as string;
}

export function operatorHeaders(
  token: string,
  headers: Readonly<Record<string, string>> = {},
): Record<string, string> {
  return { ...headers, "x-awp-session": token };
}

interface LoginPageLike {
  goto(url: string, options?: { waitUntil?: "networkidle" }): Promise<unknown>;
  getByLabel(name: string): { fill(value: string): Promise<unknown> };
  getByRole(role: string, options: { name: string }): { click(): Promise<unknown> };
  waitForURL(url: RegExp): Promise<unknown>;
}

export async function loginBrowser(
  page: LoginPageLike,
  webUrl: string,
  password: string,
): Promise<void> {
  await page.goto(`${webUrl}/login`, { waitUntil: "networkidle" });
  await page.getByLabel("Password").fill(password);
  await page.getByRole("button", { name: "Sign in" }).click();
  await page.waitForURL(/(?:\/projects(?:\/|$)|\/$)/u);
}
