import * as NodeServices from "@effect/platform-node/NodeServices";
import * as Effect from "effect/Effect";
import * as Logger from "effect/Logger";
import { runSshCommand } from "./src/command.ts";
import { mkdirSync, writeFileSync, readFileSync } from "node:fs";
import { execFileSync, spawnSync } from "node:child_process";
import { join } from "node:path";

// Run from packages/ssh, after copying this driver there as repro.ts.
// Usage: node repro.ts <new-output-directory> <commit-label>
const [directory, label] = process.argv.slice(2);
mkdirSync(directory, { recursive: true });
const started = performance.now();
const events: Array<{seconds: number; text: string}> = [];
function log(text: string) {
  const seconds = (performance.now() - started) / 1000;
  events.push({ seconds, text });
  console.log(`[${seconds.toFixed(3)}s] ${text}`);
  writeFileSync(join(directory, "events.json"), JSON.stringify(events, null, 2));
}
function state(pid: number) {
  try { return execFileSync("ps", ["-p", String(pid), "-o", "stat=,comm="], {encoding:"utf8"}).trim() || "absent"; }
  catch { return "absent"; }
}
const live = (s: string) => s !== "absent" && !s.startsWith("Z");
log(`T3 Code production SSH command | ${label}`);
log(`Linux | ${spawnSync("ssh", ["-V"], {encoding:"utf8"}).stderr.trim()} | Node ${process.version}`);
log("Real OpenSSH; isolated config; no network endpoint or credentials.");
for (const ignoresTerm of [false, true]) {
  const name = ignoresTerm ? "ignores-TERM" : "normal";
  const pidFile = join(directory, `${name}.pid`);
  const helper = join(directory, `${name}.sh`);
  const config = join(directory, `${name}.config`);
  writeFileSync(helper, `#!/bin/sh\n${ignoresTerm ? "trap '' TERM\n" : ""}echo $$ > '${pidFile}'\nexec sleep 120\n`, { mode: 0o700 });
  writeFileSync(config, `Host proof-target\n HostName 192.0.2.1\n ProxyCommand ${helper}\n`);
  log(`${name}: start runSshCommand(timeoutMs=200, preHostArgs=[-F, isolated-config])`);
  const result = await Effect.runPromise(runSshCommand(
    { alias: "proof-target", hostname: "proof-target", username: null, port: null },
    { preHostArgs: ["-F", config], timeoutMs: 200 },
  ).pipe(Effect.flip, Effect.provide(NodeServices.layer), Effect.provide(Logger.layer([]))));
  log(`${name}: returned ${result.message}`);
  const pid = Number(readFileSync(pidFile, "utf8").trim());
  if (!Number.isSafeInteger(pid) || pid <= 1) throw new Error("Invalid owned helper PID");
  const now = state(pid);
  log(`${name}: IMMEDIATELY at error return: helper PID ${pid}, ps=${now}, liveProxy=${live(now)}`);
  await new Promise(resolve => setTimeout(resolve, 2000));
  const later = state(pid);
  log(`${name}: 2 seconds later: helper PID ${pid}, ps=${later}, liveProxy=${live(later)}`);
  if (live(later)) {
    process.kill(pid, "SIGKILL");
    log(`${name}: evidence driver cleaned up captured helper PID ${pid} with SIGKILL`);
  }
}
log("Reproduction complete.");
