import { parseArgs } from "./argparse.ts";
import { cmdStart } from "./commands/start.ts";
import { cmdStop } from "./commands/stop.ts";
import { cmdDoctor } from "./commands/doctor.ts";
import { cmdGain } from "./commands/gain.ts";
import { cmdInit } from "./commands/init.ts";
import { cmdCache } from "./commands/cache.ts";
import { cmdInstall } from "./commands/install.ts";
import { cmdReload } from "./commands/reload.ts";
import { cmdRestart } from "./commands/restart.ts";
import { cmdFtBypass } from "./commands/bypass.ts";
import { cmdFtOn } from "./commands/ft-on.ts";
import { cmdFtOff } from "./commands/ft-off.ts";
import { cmdFtCheck } from "./commands/ft-check.ts";
import { cmdFtUninstall } from "./commands/ft-uninstall.ts";
import { cmdFtRepair } from "./commands/ft-repair.ts";
import { cmdStatusline } from "./commands/ft-statusline.ts";

const HELP = `fewtok — Claude Code token-compression proxy

activation: ft does NOT mutate ~/.claude/settings.json. Use the \`cld\` wrapper
to activate the proxy per-session (it sets ANTHROPIC_BASE_URL inline before
exec'ing claude). Plain \`claude\` stays un-proxied by design.

usage: fewtok <command> [flags]

commands:
  start [--background] [--port PORT]   start proxy
  stop                                  stop proxy
  reload                                hot-reload handler without restarting daemon
  restart --graceful                    zero-downtime rolling restart (new child, then retire old)
  doctor                                health check
  gain [--since 7d] [--project NAME]    show token savings
  init                                  bootstrap project
  install opencode|cline|aider          wire non-claude tool to proxy
                                         (claude target refuses — use \`cld\`)
  off                                   scrub legacy ANTHROPIC_BASE_URL from settings.json
  check                                 verify settings.json is clean + cld wrapper present
  uninstall                             scrub all legacy ft entries from settings.json
  bypass on|off|status [session-id]     per-session proxy bypass
  help                                  this message

deprecated (refuse with error — kept for migration messaging):
  on                                    use \`cld\` wrapper
  install claude                        use \`cld\` wrapper
  repair                                use \`fewtok uninstall\`
`;

export async function main(argv: string[]): Promise<number> {
  const verbose = argv.includes("-v") || argv.includes("--verbose");
  const filteredArgv = argv.filter((a) => a !== "-v" && a !== "--verbose");
  const { command, positional, flags } = parseArgs(filteredArgv);
  switch (command) {
    case "start":    return (await cmdStart(flags, {}, verbose)) as number;
    case "stop":     return cmdStop(flags, verbose);
    case "doctor":   return cmdDoctor(flags, verbose);
    case "gain":     return cmdGain(flags, verbose);
    case "init":     return cmdInit(flags, {}, verbose);
    case "cache":    return cmdCache({ positional, flags }, verbose);
    case "install":  return cmdInstall({ positional, flags }, verbose);
    case "reload":   return cmdReload(verbose);
    case "restart":  return cmdRestart(flags, verbose);
    case "bypass":    return cmdFtBypass(positional, verbose);
    case "on":        return cmdFtOn(positional, verbose);
    case "off":       return cmdFtOff(positional, verbose);
    case "check":     return cmdFtCheck(positional, verbose);
    case "uninstall": return cmdFtUninstall(positional, verbose);
    case "repair":    return cmdFtRepair(positional, verbose);
    case "statusline": return cmdStatusline();
    case "help":
    case "--help":
    case "-h":
      console.log(HELP);
      return 0;
    default:
      console.error(`unknown command: ${command}`);
      console.log(HELP);
      return 1;
  }
}
