import { execFile } from "node:child_process";
import { readdir } from "node:fs/promises";
import { promisify } from "node:util";
import { T3_HOME } from "../e2e.config.ts";
import { createServer } from "node:http";
import { expect } from "e2e";
import { test, WEB } from "./t3.ts";

test("Browser installs the security-patched Chrome", WEB, async ({ t3, app, screen, browser }) => {
  let report!: (version: string) => void;
  const observed = new Promise<string>((resolve) => { report = resolve; });
  const server = createServer(async (req, res) => {
    if (req.url === "/version") {
      const root = `${T3_HOME}/tools/chrome-headless-shell/linux64`;
      const versions = await readdir(root);
      const binary = `${root}/${versions.find((v) => /^157\./.test(v))}/chrome-headless-shell`;
      const { stdout } = await promisify(execFile)(binary, ["--version"]);
      res.end(stdout.trim());
      return;
    }
    if (req.url?.startsWith("/report?")) {
      report(new URL(req.url, "http://localhost").searchParams.get("ua") ?? "");
      res.end("ok");
      return;
    }
    res.setHeader("Content-Type", "text/html");
    res.end(`<!doctype html><html><body style="background:#101827;color:#f1f5f9;font:20px system-ui;padding:30px"><h1>Preview browser version</h1><p>Installed executable --version, after opening the server-backed Browser panel.</p><h2 id="version"></h2><p id="ua" style="overflow-wrap:anywhere"></p><script>const ua=navigator.userAgent;document.querySelector('#ua').textContent='Browser page user agent: '+ua;fetch('/version').then(r=>r.text()).then(version=>{document.querySelector('#version').textContent=version;setTimeout(()=>fetch('/report?ua='+encodeURIComponent(version)),1000);});</script></body></html>`);
  });
  await new Promise<void>((resolve) => server.listen(0, "127.0.0.1", resolve));
  try {
    const address = server.address() as { port: number };
    const project = await t3.project("Browser verification");
    const thread = await t3.thread({ project, title: "Preview browser security update", messages: ["Ready"] });
    await t3.open(thread);
    await screen.getByRole("button", "Toggle right panel").tap();
    await screen.getByRole("button", /^Browser/).tap();
    await screen.getByRole("textbox", "Search or enter URL").fill(`http://127.0.0.1:${address.port}`, { timeout: 180_000 });
    await browser.keyboard.press("Enter");
    const ua = await observed;
    await app.screenshot("installed-browser-version");
    expect(ua).toContain("157.0.8103.78");
  } finally {
    await new Promise<void>((resolve) => server.close(() => resolve()));
  }
});
