/// <reference lib="dom" />
import { expect } from "e2e";
import { T3_HOME } from "../e2e.config.ts";
import { test, WEB, makeState, runPromise } from "./t3.ts";

test("CLI re-add restores the archived project and preserves its identity", WEB, async ({ t3, app, browser, screen }) => {
  const project = await t3.project("demo-project");
  const cli = makeState(T3_HOME).cli;
  await t3.open("/settings/projects");
  await screen.getByRole("button", "Project scope: All projects").tap();
  await screen.getByRole("menuitemradio").filter({ hasText: "demo-project" }).tap();
  const settingsUrl = await browser.evaluate(() => location.pathname + location.search);
  const results: Array<{ stdout: string; stderr: string; exitCode: number }> = [];
  const showOutput = async (label: string) => {
    const output = results.map((result, index) => `${index === 0 ? '$ t3 project add /demo-project' : index === 1 ? '$ t3 project add /demo-project --title "Back again"' : '$ t3 project add /demo-project'}\n${(result.stdout + result.stderr).replaceAll(project, "/demo-project").replace(/\x1b\[[0-9;]*m/g, "").split("\n").filter(line => !line.includes(" at ") || !line.includes(".ts:")).slice(0, 2).join("\n")}\nexit ${result.exitCode}`).join("\n\n");
    await browser.evaluate(({ output, project }) => {
      document.getElementById("cli-evidence")?.remove();
      const walker = document.createTreeWalker(document.body, NodeFilter.SHOW_TEXT);
      while (walker.nextNode()) { const node = walker.currentNode; if (node.textContent?.includes(project)) node.textContent = node.textContent.replaceAll(project, "/demo-project"); }
      const panel = document.createElement("pre"); panel.id = "cli-evidence";
      panel.textContent = "REAL CLI OUTPUT (workspace path anonymized)\n\n" + output;
      panel.style.cssText = "position:fixed;bottom:12px;left:280px;right:16px;max-height:270px;overflow:hidden;background:#101820;color:#e6f4ed;border:1px solid #5c8271;padding:16px;font:12px/1.3 monospace;z-index:99999;white-space:pre-wrap";
      document.body.append(panel);
    }, { output, project });
    await app.screenshot(label);
  };
  await screen.getByRole("region", "Settings content").getByRole("button", "Archive", { exact: true }).tap();
  await screen.getByRole("button", "Unarchive", { exact: true }).waitFor({ state: "visible" });
  results.push(await runPromise(cli(["project", "add", project], [0, 1])));
  await browser.evaluate(() => document.getElementById("cli-evidence")?.remove());
  await app.open(settingsUrl);
  await screen.getByRole("region", "Settings content").getByRole("button", /^(Unarchive|Archive)$/).waitFor({ state: "visible" });
  await showOutput("readd-without-title");
  if (results[0]!.exitCode === 0) {
    await browser.evaluate(() => document.getElementById("cli-evidence")?.remove());
    await screen.getByRole("region", "Settings content").getByRole("button", "Archive", { exact: true }).tap();
    await screen.getByRole("button", "Unarchive", { exact: true }).waitFor({ state: "visible" });
  }
  results.push(await runPromise(cli(["project", "add", project, "--title", "Back again"], [0, 1])));
  await app.open(settingsUrl);
  await screen.getByRole("region", "Settings content").getByRole("button", /^(Unarchive|Archive)$/).waitFor({ state: "visible" });
  await showOutput("readd-with-title");
  if (results[1]!.exitCode === 0) results.push(await runPromise(cli(["project", "add", project], [0, 1])));
  await showOutput("final-cli-and-project-state");
  await expect(results[0]!.exitCode).toBe(0);
  await expect(results[0]!.stdout).toContain("(demo-project)");
  await expect(results[1]!.exitCode).toBe(0);
  await expect(results[1]!.stdout).toContain("(Back again)");
  await expect(results[1]!.stdout.split(" ")[2]).toBe(results[0]!.stdout.split(" ")[2]);
  await expect(results[2]!.exitCode).toBe(1);
  await expect(screen.getByRole("region", "Settings content").getByRole("button", "Archive", { exact: true })).toBeVisible();
});
