import { expect } from "e2e";
import { test, WEB } from "./t3.ts";

test("Saved default survives a disabled provider", WEB, async ({t3, app, screen, browser}) => {
  // Cosmetic redaction keeps catalog identifiers out of public captures.
  await browser.addInitScript(() => {
    const style = document.createElement("style");
    style.textContent = `
      #default-model [data-chat-provider-model-picker-label] { font-size: 0 !important; line-height: 20px !important; display: inline-flex; align-items: center; }
      #default-model [data-chat-provider-model-picker-label]::after { content: "Codex model"; font-size: 14px; line-height: 20px; }
      #default-model button[aria-label^="Claude"] [data-chat-provider-model-picker-label]::after { content: "Claude model"; }
      #default-model button[aria-label="Showcase"] [data-chat-provider-model-picker-label]::after { content: "Replay model"; }
      [role="option"] * { visibility: hidden !important; }
      [role="option"]::after { content: "Model option (redacted)"; font-size: 14px; }
    `;
    document.addEventListener("DOMContentLoaded", () => document.head.append(style));
  });
  await t3.project("Settings demo");
  await t3.open();
  await screen.getByText("Settings demo", {exact: true}).first().waitFor();
  await app.open("/settings/providers");
  await screen.getByText("Authenticated", {exact: false}).first().waitFor();
  await screen.getByRole("treeitem", "Threads", {exact:true}).tap();
  await screen.getByText("Default model for new threads", {exact: false}).first().waitFor();
  await browser.locator("#default-model [data-chat-provider-model-picker]").tap();
  await screen.getByRole("button", "Claude", {exact:true}).tap();
  await screen.getByRole("option").first().tap();
  await browser.keyboard.press("Escape");
  const picker = browser.locator("#default-model [data-chat-provider-model-picker]");
  await browser.locator("#default-model").getByRole("button", "Medium", {exact:true}).waitFor();
  const savedName = await picker.textContent();
  await browser.keyboard.press("Escape");
  await browser.locator("#default-model").getByRole("button", "Medium", {exact:true}).tap();
  await screen.getByRole("menuitemradio", "High", {exact:true}).tap();
  await browser.locator("#default-model").getByRole("button", "High", {exact:true}).waitFor();
  await app.screenshot("saved-default");
  await screen.getByRole("treeitem", "Providers", {exact:true}).tap();
  await screen.getByRole("switch", "Enable Claude").tap();
  await screen.getByRole("treeitem", "Threads", {exact:true}).tap();
  const row = browser.locator("#default-model");
  await row.waitFor();
  await app.screenshot("provider-disabled");
  const disabledText = await row.textContent();
  const effort = browser.locator('#default-model button[aria-haspopup="menu"]');
  if (await effort.count()) {
    await effort.tap();
    await screen.getByRole("menuitemradio", "High", {exact:true}).tap();
    await row.getByRole("button", "High", {exact:true}).waitFor();
  }
  await app.screenshot("after-effort-attempt");
  await screen.getByRole("treeitem", "Providers", {exact:true}).tap();
  await screen.getByRole("switch", "Enable Claude").tap();
  await screen.getByRole("treeitem", "Threads", {exact:true}).tap();
  await row.waitFor();
  await app.screenshot("provider-reenabled");
  const restoredName = await picker.textContent();
  const restoredEffortVisible = await row.getByRole("button", "High", {exact:true}).isVisible();
  // An explicit choice must still save, including while the previous provider is disabled.
  await screen.getByRole("treeitem", "Providers", {exact:true}).tap();
  await screen.getByRole("switch", "Enable Claude").tap();
  await screen.getByRole("treeitem", "Threads", {exact:true}).tap();
  await picker.tap();
  await screen.getByRole("button", "Replay (dev)", {exact:true}).tap();
  await screen.getByRole("option").first().tap();
  await browser.keyboard.press("Escape");
  await picker.filter({hasText:"Showcase"}).waitFor();
  await screen.getByRole("treeitem", "Providers", {exact:true}).tap();
  await screen.getByRole("switch", "Enable Claude").waitFor();
  await screen.getByRole("treeitem", "Threads", {exact:true}).tap();
  await picker.filter({hasText:"Showcase"}).waitFor();
  await app.screenshot("intentional-model-change");
  expect(restoredName).toBe(savedName);
  expect(restoredEffortVisible).toBe(true);
  expect(disabledText).toContain("Claude is turned off.");
  await expect(picker).toHaveText("Showcase");
});
