import { existsSync, readFileSync } from "node:fs";
import { paths } from "../../lifecycle/paths.ts";

/**
 * Resolve the current session ID via PID walk-up.
 * Starts from process.ppid and walks up until a session-pids file is found.
 * Returns null if no session-pids file found within 20 hops.
 */
export function findSessionId(explicit?: string): string | null {
  if (explicit) return explicit;

  let pid = process.ppid;
  for (let i = 0; i < 20 && pid > 1; i++) {
    const file = paths.sessionPidFile(pid);
    if (existsSync(file)) {
      const sid = readFileSync(file, "utf8").trim();
      return sid.length > 0 ? sid : null;
    }
    try {
      const result = Bun.spawnSync(["ps", "-o", "ppid=", "-p", String(pid)], {
        stderr: "ignore",
      });
      const ppidStr = result.stdout.toString().trim();
      const ppid = Number(ppidStr);
      if (!ppid || ppid === pid) break;
      pid = ppid;
    } catch {
      break;
    }
  }
  return null;
}

/**
 * Read proxy port from port file. Returns null if not running.
 */
export function readProxyPort(): number | null {
  if (!existsSync(paths.portFile())) return null;
  const raw = readFileSync(paths.portFile(), "utf8").trim();
  const port = Number(raw);
  return Number.isFinite(port) && port > 0 ? port : null;
}
