import { readFile } from "node:fs/promises";
import { setTimeout as delay } from "node:timers/promises";
import { createServer } from "node:http";
import { expect } from "e2e";
import { test, WEB } from "./t3.ts";

test("Schemeless IPv4 loopback previews load a plain HTTP server", WEB, async ({ t3, app, screen }) => {
  const stableScreenshot = async (label: string) => {
    let previous = await readFile(await app.screenshot(`${label}-settling`));
    for (let attempt = 0; attempt < 30; attempt++) {
      await delay(500);
      const path = await app.screenshot(`${label}-stable-${attempt}`);
      const current = await readFile(path);
      if (previous.equals(current)) {
        await app.screenshot(label);
        return;
      }
      previous = current;
    }
    throw new Error(`The ${label} capture did not settle`);
  };
  let requests = 0;
  const server = createServer((_request, response) => {
    requests++;
    response.writeHead(200, { "Content-Type": "text/html", "Cache-Control": "no-store" });
    response.end(`<!doctype html><html><head><title>Loopback HTTP demo</title></head><body style="margin:0;padding:48px;background:#ecfdf5;color:#064e3b;font:20px system-ui"><h1>Loopback preview loaded</h1><p>This page is served over plain HTTP.</p><p><strong>127.0.0.2:3000</strong></p></body></html>`);
  });
  await new Promise<void>((resolve, reject) => { server.once("error", reject); server.listen(3000, "127.0.0.2", resolve); });
  try {
    const project = await t3.project("loopback-demo");
    await t3.thread({ project, title: "Loopback preview", messages: ["Ready"] });
    await t3.open();
    await screen.getByTestId("sidebar-row-card").first().tap();
    await screen.getByRole("button", "Toggle right panel", { exact: true }).tap();
    await screen.getByRole("button", "Browser B", { exact: true }).tap();
    const address = screen.getByRole("textbox", "Search or enter URL");
    await address.fill("http://127.0.0.2:3000");
    await address.press("Enter");
    await expect.poll(() => requests).toBeGreaterThan(0);
    await screen.getByRole("button", "Refresh", { exact: true }).waitFor({ state: "visible" });
    await stableScreenshot("explicit-http-control");
    await address.fill("https://127.0.0.2:3000");
    await address.press("Enter");
    await screen.getByRole("button", "Refresh", { exact: true }).waitFor({ state: "visible" });
    await stableScreenshot("explicit-https-control");
    await address.fill("127.0.0.2:3000");
    await address.press("Enter");
    await screen.getByRole("button", "Refresh", { exact: true }).waitFor({ state: "visible" });
    await stableScreenshot("schemeless-loopback");
    await expect(address).toHaveValue("http://127.0.0.2:3000/");
  } finally {
    server.closeAllConnections();
    await new Promise<void>((resolve) => server.close(() => resolve()));
  }
});
