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

test("A missing project folder explains recovery and a restored folder runs a shell", WEB, async ({ t3, app, screen, browser }) => {
  const project = await t3.project("terminal-recovery-demo");
  await t3.thread({ project, title: "Terminal recovery", messages: ["Ready"] });
  await t3.open();
  await screen.getByRole("button", "Terminal recovery, Done, terminal-recovery-demo", { exact: true }).tap();
  await rename(project, `${project}-moved`);
  let guidance = "";
  const readTerminal = async () => {
    return browser.evaluate(() => {
      const input = document.querySelector('textarea[aria-label="Terminal input"]') as HTMLTextAreaElement;
      if (!input) return "";
      input.focus();
      input.dispatchEvent(new KeyboardEvent("keydown", { key: "A", ctrlKey: true, shiftKey: true, bubbles: true, cancelable: true }));
      const data = new DataTransfer();
      input.dispatchEvent(new ClipboardEvent("copy", { bubbles: true, cancelable: true, clipboardData: data }));
      return data.getData("text/plain");
    });
  };
  try {
    await screen.getByRole("button", "Toggle terminal drawer", { exact: true }).tap();
    // Opening the drawer creates a fresh terminal after the directory has moved.
    await expect.poll(readTerminal).toContain("does not exist:");
    await screen.getByRole("button", /^New Terminal/).first().tap();
    await expect.poll(readTerminal).toContain("does not exist:");
    guidance = await readTerminal();
    await browser.locator("canvas").last().tap();
    await app.screenshot("missing-folder");
  } finally {
    await rename(`${project}-moved`, project);
  }
  await screen.getByRole("button", /^New Terminal/).first().tap();
  await browser.evaluate(() => { (document.querySelector('textarea[aria-label="Terminal input"]') as HTMLTextAreaElement)?.focus(); return null; });
  await browser.keyboard.type("printf 'RECOVERED\\n'");
  await browser.keyboard.press("Enter");
  await expect.poll(readTerminal).toContain("RECOVERED\n");
  await browser.locator("canvas").last().tap();
  await app.screenshot("restored-folder");
  expect(guidance).toContain(`Terminal folder does not exist: ${project}. Restore the folder at this path before retrying.`);
});
