// src/cli/commands/bypass.ts
import { findSessionId, readProxyPort } from "./_session.ts";

async function callControl(path: string, sessionId: string): Promise<{ ok: boolean; error?: string }> {
  const port = readProxyPort();
  if (port === null) return { ok: false, error: "not-running" };
  try {
    const res = await fetch(
      `http://127.0.0.1:${port}/_ft/${path}?session=${encodeURIComponent(sessionId)}`,
      { method: "POST" },
    );
    return (await res.json()) as { ok: boolean; error?: string };
  } catch {
    return { ok: false, error: "not-running" };
  }
}

async function bypassOn(positional: string[], verbose: boolean): Promise<number> {
  const sid = findSessionId(positional[0]);
  if (!sid) { console.log("err=session-not-found (hint: restart cld)"); return 1; }
  const body = await callControl("on", sid);
  if (body.ok) { console.log(verbose ? `bypass disabled for ${sid}` : "ok"); return 0; }
  console.log(`err=${body.error ?? "unknown"}`);
  return 1;
}

async function bypassOff(positional: string[], verbose: boolean): Promise<number> {
  const sid = findSessionId(positional[0]);
  if (!sid) { console.log("err=session-not-found (hint: restart cld)"); return 1; }
  const body = await callControl("off", sid);
  if (body.ok) { console.log(verbose ? `bypass enabled for ${sid}` : "ok"); return 0; }
  console.log(`err=${body.error ?? "unknown"}`);
  return 1;
}

async function bypassStatus(_positional: string[], verbose: boolean): Promise<number> {
  const port = readProxyPort();
  if (port === null) { console.log("err=not-running"); return 1; }
  try {
    const res = await fetch(`http://127.0.0.1:${port}/_ft/status`);
    const body = (await res.json()) as { bypassed: string[] };
    if (verbose) {
      if (body.bypassed.length === 0) console.log("no sessions bypassed");
      else for (const s of body.bypassed) console.log(s);
    } else {
      console.log(body.bypassed.length === 0 ? "none" : body.bypassed.join(" "));
    }
    return 0;
  } catch {
    console.log("err=not-running");
    return 1;
  }
}

export async function cmdFtBypass(
  positional: string[],
  verbose: boolean,
): Promise<number> {
  const sub = positional[0];
  const rest = positional.slice(1);
  switch (sub) {
    case "on":     return bypassOn(rest, verbose);
    case "off":    return bypassOff(rest, verbose);
    case "status": return bypassStatus(rest, verbose);
    default:
      console.error("usage: fewtok bypass on|off|status [session-id]");
      return 1;
  }
}
