import { expect, type Page } from "@playwright/test";

export async function submitLoginWithThrottle(
    page: Page,
    prepare: () => Promise<void>,
    nativeSubmit = false,
) {
    for (let attempt = 0; attempt < 2; attempt++) {
        await page.goto("/login");
        await prepare();
        const [response] = await Promise.all([
            page.waitForResponse(
                (r) =>
                    r.request().method() === "POST" &&
                    new URL(r.url()).pathname === "/login",
            ),
            nativeSubmit
                ? page
                      .locator("form")
                      .evaluate((form) =>
                          (form as HTMLFormElement).requestSubmit(),
                      )
                : page
                      .getByRole("button", { name: "Sign in", exact: true })
                      .click(),
        ]);
        if (response.status() !== 429) return;
        const seconds = Number(response.headers()["retry-after"]);
        if (attempt || !Number.isFinite(seconds) || seconds < 0 || seconds > 60)
            throw new Error("Login rate-limit response needs review.");
        await new Promise((resolve) =>
            setTimeout(resolve, (seconds + 1) * 1000),
        );
    }
}

// Exercise the real login limiter and honor its Retry-After response when a multi-role suite hits it.
export async function login(page: Page, account: string) {
    for (let attempt = 0; attempt < 2; attempt++) {
        await page.context().clearCookies();
        await page.goto("/login");
        const dashboard = new URL("/", page.url()).href;
        await page
            .getByLabel("Email address", { exact: true })
            .fill(account.includes("@") ? account : `${account}@school.test`);
        await page
            .getByLabel("Password", { exact: true })
            .fill("SchoolDemo2026!");
        const [response] = await Promise.all([
            page.waitForResponse(
                (response) =>
                    response.request().method() === "POST" &&
                    new URL(response.url()).pathname === "/login",
                { timeout: 15000 },
            ),
            page.getByRole("button", { name: "Sign in", exact: true }).click(),
        ]);
        if (response.status() !== 429) {
            await expect(page).toHaveURL(dashboard);
            return;
        }
        const seconds = Number(response.headers()["retry-after"]);
        if (attempt || !Number.isFinite(seconds) || seconds < 0 || seconds > 60)
            throw new Error("Login rate-limit response needs review.");
        await new Promise((resolve) =>
            setTimeout(resolve, (seconds + 1) * 1000),
        );
    }
}
