import { execFile } from "node:child_process";
import { promisify } from "node:util";
import { mkdir, readFile, readdir, writeFile } from "node:fs/promises";
import { join } from "node:path";
import { expect } from "e2e";
import { APP_DIR, T3_HOME } from "../e2e.config.ts";
import { test, WEB } from "./t3.ts";

const exec = promisify(execFile);

test("Re-linking retires every replaced peer session and preserves the current link", WEB, async ({ t3, app, screen, browser }) => {
  const runDir = join(process.env.T3_PEER_PROOF_OUTPUT ?? "/tmp/peer-relink-proof", `run-${Date.now()}`);
  const a = join(runDir, "linking-client");
  await mkdir(join(a, "userdata"), { recursive: true });
  await writeFile(join(a, "userdata/settings.json"), JSON.stringify({ linkedEnvironmentsEnabled: true }));
  const cli = async (home: string, args: string[]) => (await exec(process.execPath, ["apps/server/src/bin.ts", ...args, "--base-dir", home], {
    cwd: APP_DIR,
    env: { ...process.env, PATH: `${T3_HOME}/bin:${process.env.PATH}`, T3CODE_DEV_SEED: "0" },
    maxBuffer: 4 * 1024 * 1024,
  })).stdout;
  const sessions = async () => JSON.parse(await cli(T3_HOME, ["auth", "session", "list", "--json"]));
  const token = async () => {
    const dir = join(a, "userdata/secrets");
    const name = (await readdir(dir)).find((name) => name.startsWith("peer-link-"))!;
    return readFile(join(dir, name), "utf8");
  };
  const initialize = async (bearer: string) => {
    const response = await fetch(`${app.baseUrl}/mcp`, {
      method: "POST",
      headers: { Authorization: `Bearer ${bearer}`, "Content-Type": "application/json", Accept: "application/json, text/event-stream" },
      body: JSON.stringify({ jsonrpc: "2.0", id: 1, method: "initialize", params: { protocolVersion: "2025-03-26", capabilities: {}, clientInfo: { name: "Proof probe", version: "1" } } }),
    });
    await response.body?.cancel();
    return response.status;
  };
  await t3.project("Peer link proof");
  await t3.open("/settings/labs");
  await screen.getByRole("switch", "Linked environments", { exact: true }).tap();
  await app.open("/settings/access");
  await screen.getByText("Authorized clients", { exact: true }).tap();
  await app.screenshot("before-renewals");
  const counts: number[] = [];
  let replaced = "";
  for (let i = 0; i < 5; i++) {
    const pairing = JSON.parse(await cli(T3_HOME, ["auth", "pairing", "create", "--json"]));
    await cli(a, ["environment", "link", app.baseUrl!, "--pairing-code", pairing.credential]);
    counts.push((await sessions()).filter((session: any) => session.subject === "mcp-client").length);
    if (i === 3) replaced = await token();
  }
  const results = {
    renewalSessionCounts: counts,
    replacedBearerHttpStatus: await initialize(replaced),
    currentBearerHttpStatus: await initialize(await token()),
    garbageBearerHttpStatus: await initialize("garbage"),
    localLinkCount: JSON.parse(await cli(a, ["environment", "list", "--json"])).length,
    localTokenFileCount: (await readdir(join(a, "userdata/secrets"))).filter((name) => name.startsWith("peer-link-")).length,
  };
  await writeFile(join(runDir, "results.json"), JSON.stringify(results, null, 2));
  console.log("Peer renewal runtime results:", JSON.stringify(results));
  await browser.evaluate(() => {
    document.querySelector('[data-testid="authorized-clients-scroll-area"]')?.scrollIntoView({ block: "center", behavior: "instant" });
  });
  await app.screenshot("authorized-clients-after-five-links");
  await expect(screen.getByText("T3 Code · Scenario", { exact: true })).toHaveCount(1);
  expect(results.replacedBearerHttpStatus).toBe(401);
  expect(results.currentBearerHttpStatus).toBe(200);
  expect(results.garbageBearerHttpStatus).toBe(401);
  expect(results.localLinkCount).toBe(1);
  expect(results.localTokenFileCount).toBe(1);
});
