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

test("Fork history survives repeated source rewinds", WEB, async ({ t3, app, screen, browser }) => {
  const project = await t3.project("Token memory");
  await t3.thread({ project, title: "Source memory", messages: ["Remember alpha", "Remember bravo"] });
  await t3.open();
  await screen.getByRole("button", "Source memory, Done, Token memory").tap();
  await screen.getByText("second fixture turn complete", { exact: false }).waitFor();
  const source = await browser.url();
  await screen.getByRole("button", "Fork from this response").last().tap();
  await screen.getByText("Forked from conversation", { exact: false }).waitFor();
  const control = await browser.url();
  await app.screenshot("control-alpha-bravo");
  await browser.goto(source);
  await screen.getByRole("button", "Agent Remember bravo").tap();
  await screen.getByRole("button", "Edit from here").last().tap();
  await screen.getByRole("button", "Revert and keep changes").tap();
  await browser.locator('[data-testid="composer-editor"]:has-text("Remember bravo")').waitFor();
  await screen.getByRole("textbox").fill("Remember charlie");
  await browser.locator('button[aria-label="Submit message"]:not(:disabled)').waitFor();
  await screen.getByRole("button", "Submit message").tap();
  await screen.getByRole("button", "Fork from this response").nth(1).waitFor();
  await screen.getByRole("button", "Stop generation").waitFor({state:"hidden"});
  await screen.getByRole("button", "Fork from this response").last().tap();
  await screen.getByText("Forked from conversation", { exact: false }).waitFor();
  const later = await browser.url();
  await app.screenshot("later-fork-alpha-charlie");
  const laterBefore = await screen.getByText("Remember bravo", {exact:true}).count();
  await browser.goto(source);
  await screen.getByRole("button", "Edit from here").last().tap();
  await screen.getByRole("button", "Revert and keep changes").tap();
  await browser.locator('[data-testid="composer-editor"]:has-text("Remember charlie")').waitFor();
  await screen.getByRole("textbox").fill("");
  await browser.goto(control);
  await browser.reload();
  await screen.getByText("Remember alpha", {exact:true}).waitFor();
  await app.screenshot("control-after-source-rewind");
  const controlBravo = await screen.getByText("Remember bravo", {exact:true}).count();
  await browser.goto(later);
  await browser.reload();
  await screen.getByText("Remember alpha", {exact:true}).waitFor();
  await app.screenshot("later-after-source-rewind");
  await expect(laterBefore).toBe(0);
  await expect(controlBravo).toBe(1);
  await expect(screen.getByText("Remember charlie", {exact:true})).toBeVisible();
  await expect(screen.getByText("Remember bravo", {exact:true})).toBeHidden();
});
