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

test("DCS BEL payload stays hidden after terminal reconnect", WEB, async ({ t3, app, screen, browser }) => {
  const stableCapture = async (label: string) => {
    await browser.locator("[data-thread-terminal-drawer] canvas").first().tap();
    await browser.evaluate(() => (document.activeElement as HTMLElement)?.blur());
    let previous = await app.screenshot(`${label}-settling`);
    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 current;
      previous = current;
    }
    throw new Error("Capture did not stabilize");
  };
  const project = await t3.project("terminal-replay", {
    "repro.py": `import sys\nsys.stdout.write("\\x1b[2J\\x1b[H")\nsys.stdout.write("DCS BEL replay reproduction\\r\\n")\nsys.stdout.write("DECRQSS: A\\x1bP$qm\\x07HIDDEN\\x1b\\\\B\\r\\n")\nsys.stdout.write("XTGETTCAP: A\\x1bP+q544e\\x07HIDDEN\\x1b\\\\B\\r\\n")\nsys.stdout.write("ST control: A\\x1bP$qmHIDDEN\\x1b\\\\B\\r\\n")\nsys.stdout.write("OSC BEL control: A\\x1b]0;title\\x07B\\r\\n")\nsys.stdout.write("REPRO COMPLETE\\r\\n")\nsys.stdout.flush()\n`,
  });
  await t3.thread({ project, title: "Terminal history replay", messages: ["Prepare a terminal replay demonstration."] });
  await t3.open();
  await browser.locator("li[data-thread-item]").first().tap();
  await browser.keyboard.press("Control+j");
  const text = async () => {
    await screen.getByRole("textbox", "Terminal input").press("Control+Shift+a");
    return browser.evaluate(() => {
      const input = document.querySelector('textarea[aria-label="Terminal input"]')!;
      const clipboardData = new DataTransfer();
      input.dispatchEvent(new ClipboardEvent("copy", { bubbles: true, clipboardData }));
      return clipboardData.getData("text/plain");
    });
  };
  await expect.poll(text).toContain("$");
  await screen.getByRole("textbox", "Terminal input").press("Control+u");
  await browser.evaluate(() => {
    const input = document.querySelector('textarea[aria-label="Terminal input"]')!;
    const clipboardData = new DataTransfer();
    clipboardData.setData("text/plain", "export PS1=''; stty -echo; python3 repro.py");
    input.dispatchEvent(new ClipboardEvent("paste", { bubbles: true, clipboardData }));
  });
  await screen.getByRole("textbox", "Terminal input").press("Enter");
  await expect.poll(text).toContain("REPRO COMPLETE");
  await screen.getByRole("textbox", "Terminal input").press("ArrowRight");
  await stableCapture("live-terminal");
  const url = await browser.evaluate(() => location.href);
  await app.open(url);
  await screen.getByRole("textbox", "Terminal input").press("Control+u");
  await expect.poll(text).toContain("REPRO COMPLETE");
  const replay = await text();
  await screen.getByRole("textbox", "Terminal input").press("ArrowRight");
  await stableCapture("replayed-terminal");
  expect(replay).not.toContain("HIDDEN");
});
