import { expect } from "e2e";
import { execFileSync } from "node:child_process";
import { readFileSync, writeFileSync, watch, existsSync } from "node:fs";
import { test, WEB } from "./t3.ts";
import { T3_HOME } from "../e2e.config.ts";

test("A single lowercase directory PR template reaches description generation", WEB, async ({t3, app, screen, browser}) => {
  const project = await t3.project("template-demo", {
    ".github/pull_request_template/feature.md": "## Change details\n\nDescribe the change.\n\n## Verification evidence\n\nDescribe verification.\n",
    "src/greeting.ts": 'export const greeting = "Hello";\n',
  });
  const git = (...args: string[]) => execFileSync("git", args, {cwd: project});
  git("remote", "add", "origin", "https://github.com/scenario/template-demo.git");
  git("update-ref", "refs/remotes/origin/main", "HEAD");
  git("symbolic-ref", "refs/remotes/origin/HEAD", "refs/remotes/origin/main");
  git("checkout", "-b", "feature/greeting");
  writeFileSync(`${project}/src/greeting.ts`, 'export const greeting = "Hello, world!";\n');
  git("add", "src/greeting.ts");
  git("-c", "user.name=Scenario", "-c", "user.email=scenario@example.invalid", "commit", "--allow-empty", "-m", "Improve greeting");
  git("update-ref", "refs/remotes/origin/feature/greeting", "HEAD");
  git("config", "branch.feature/greeting.remote", "origin");
  git("config", "branch.feature/greeting.merge", "refs/heads/feature/greeting");
  await t3.thread({project, title: "Lowercase PR template", messages:["Prepare the greeting change"]});
  await t3.open();
  await screen.getByRole("button", "Lowercase PR template, Done, template-demo", {exact:true}).waitFor({state:"visible"});
  console.log("Opening seeded thread");
  await browser.evaluate(() => { (document.querySelector('[data-testid="sidebar-row-card"]') as HTMLElement).click(); });

  console.log("Starting PR action");
  await screen.getByRole("button", "Create PR", {exact:true}).tap();
  console.log("PR action clicked");

  await screen.getByText("Preview only: submission intercepted", {exact:false}).first().waitFor({state:"visible",timeout:180000});
  const body = readFileSync(`${T3_HOME}/captured-description.md`, "utf8");
  writeFileSync(`${project}/PR-description.md`, body);
  await screen.getByRole("button", "Dismiss notification").tap();
  await screen.getByRole("button", "Toggle terminal drawer").tap();
  await screen.getByRole("textbox", "Terminal input").waitFor({state:"visible"});
  await new Promise<void>((resolve) => {
    const watcher = watch(project, (_event, file) => {
      if (file === ".capture-ready") { watcher.close(); resolve(); }
    });
    if (existsSync(`${project}/.capture-ready`)) { watcher.close(); resolve(); }
  });
  let previous = await app.screenshot("settling");
  let stable = false;
  for (let attempt = 0; attempt < 12; attempt++) {
    await new Promise((resolve) => setTimeout(resolve, 500));
    const current = await app.screenshot("settling");
    if (readFileSync(previous).equals(readFileSync(current))) { stable = true; break; }
    previous = current;
  }
  if (!stable) throw new Error("The capture did not settle");
  await app.screenshot("generated-description");
  expect(body).toContain("## Verification evidence");
});
