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

test("Diff selection survives thread and Settings navigation", WEB, async ({ t3, app, screen, browser }) => {
  const capture = async (label: string) => {
    let previous = await readFile(await app.screenshot(`${label}-settling`));
    for (let frame = 0; frame < 20; frame++) {
      await setTimeout(500);
      const current = await readFile(await app.screenshot(`${label}-check-${frame}`));
      if (current.equals(previous)) { await app.screenshot(label); return; }
      previous = current;
    }
    throw new Error(`Capture did not settle: ${label}`);
  };
  const project = await t3.project("Diff navigation", { "src/greeting.ts": 'export const greeting = "Hello";\n' });
  await t3.thread({ project, title: "Review greeting", messages: ["Review greeting", "Review follow-up"] });
  await t3.thread({ project, title: "Other work", messages: ["Other work"] });
  await writeFile(`${project}/src/greeting.ts`, 'export const greeting = "Hello, world!";\n');
  await t3.open();
  await screen.getByRole("button", /^Review greeting,/).tap();
  await browser.keyboard.press("Control+d");
  const scope = () => screen.getByRole("button", /^Diff scope:/);
  await scope().tap();
  await screen.getByRole("menuitemradio", "Uncommitted", { exact: true }).tap();
  await capture("uncommitted-selected");
  await screen.getByRole("button", /^Other work,/).tap();
  await screen.getByRole("button", /^Review greeting,/).tap();
  await capture("uncommitted-after-thread-return");
  await expect.soft(scope()).toHaveText("Uncommitted");
  await scope().tap();
  await screen.getByRole("menuitem", "Turn", { exact: true }).hover();
  await screen.getByRole("menuitemradio", /^Turn 1/).tap();
  await capture("turn-one-selected");
  await screen.getByRole("button", "Settings", { exact: true }).tap();
  await screen.getByRole("dialog", "Settings", { exact: true }).waitFor();
  await capture("settings");
  await screen.getByRole("button", "Close", { exact: true }).tap();
  await screen.getByRole("dialog", "Settings", { exact: true }).waitFor({ state: "hidden" });
  await capture("turn-one-after-settings-return");
  await expect.soft(scope()).toHaveText("Turn 1");
});
