import { spawnSync } from "node:child_process";
import type { Adapter, AbsoluteTotals } from "./Adapter.ts";

function runRtk(args: string[], timeoutMs: number): { stdout: string; ok: boolean } {
  const r = spawnSync("rtk", args, { encoding: "utf-8", timeout: timeoutMs, shell: false });
  if (r.error || (r.status ?? 1) !== 0) return { stdout: "", ok: false };
  return { stdout: r.stdout ?? "", ok: true };
}

function isInstalled(): boolean {
  return runRtk(["--version"], 2000).ok;
}

function getCurrentVersion(): string | null {
  const { stdout, ok } = runRtk(["--version"], 2000);
  if (!ok) return null;
  const m = stdout.match(/(\d+\.\d+\.\d+)/);
  return m ? m[1]! : null;
}

interface RtkSummary {
  total_input?: number;
  total_output?: number;
  total_saved?: number;
  total_commands?: number;
}

function readSavings(): AbsoluteTotals | null {
  const { stdout, ok } = runRtk(["gain", "-f", "json"], 5000);
  if (!ok) return null;
  let parsed: { summary?: RtkSummary };
  try { parsed = JSON.parse(stdout); } catch { return null; }
  const s = parsed.summary;
  if (!s) return null;
  return {
    bytesIn: s.total_input ?? 0,
    bytesOut: s.total_output ?? 0,
    tokensIn: 0,
    tokensOut: 0,
    hits: s.total_commands ?? 0,
  };
}

export const rtkAdapter: Adapter = {
  id: "rtk",
  displayLabel: "RTK",
  isInstalled,
  getCurrentVersion,
  readSavings,
};
