import { readFile } from "node:fs/promises";
import { expect } from "e2e";
import { test, WEB } from "./t3.ts";

test("New model waits for a price before showing required-price errors", WEB, async ({ t3, app, screen }) => {
  const capture = async (label: string) => {
    let previous = await app.screenshot(`${label}-stability`);
    for (let attempt = 0; attempt < 8; attempt++) {
      await new Promise((resolve) => setTimeout(resolve, 500));
      const current = await app.screenshot(label);
      if ((await readFile(previous)).equals(await readFile(current))) return;
      previous = current;
    }
    throw new Error(`Screenshot did not settle: ${label}`);
  };
  await t3.project("Pricing demo");
  await t3.open();
  await screen.getByRole("button", "Usage", { exact: true }).tap();
  await screen.getByRole("button", "Cost", { exact: true }).tap();
  await screen.getByRole("button", "All environments", { exact: true }).tap();
  await screen.getByRole("menuitem", "Model prices").tap();
  await screen.getByRole("button", "Add model price").tap();
  const model = screen.getByRole("combobox", "New model ID");
  await model.fill("example-unpriced-model");
  await capture("model-id-only");
  await screen.getByRole("textbox", "Input price for example-unpriced-model").fill("2");
  await capture("input-price-only");
  await expect(screen.getByRole("alert")).toContainText("Output is required on");
  await expect(screen.getByRole("button", "Save changes")).toBeDisabled();
  await screen.getByRole("textbox", "Output price for example-unpriced-model").fill("3");
  await capture("complete-prices");
  await expect(screen.getByRole("button", "Save changes")).toBeEnabled();
  await screen.getByRole("textbox", "Output price for example-unpriced-model").fill("");
  await screen.getByRole("textbox", "Input price for example-unpriced-model").fill("");
  await capture("model-id-only-restored");
  await expect(screen.getByRole("button", "Save changes")).toBeDisabled();
  await expect(screen.getByRole("alert")).not.toBeVisible();
  await expect(model).not.toHaveAttribute("aria-invalid");
});
