// src/cli/commands/init.ts
import { mkdirSync, existsSync, writeFileSync } from "node:fs";
import { paths } from "../../lifecycle/paths.ts";
import { findFreePort, isPortInUse } from "../../lifecycle/port.ts";
import { loadGlobalConfig, setGlobalConfigPort } from "../../lifecycle/config.ts";

export interface InitOpts { cwd?: string }

export async function cmdInit(_flags: Record<string, string | true>, opts: InitOpts = {}, verbose = false): Promise<number> {
  const cwd = opts.cwd ?? process.cwd();
  for (const d of [paths.root(), paths.state(), paths.cache(), paths.logs(), paths.global()]) {
    mkdirSync(d, { recursive: true });
  }

  const cfg = loadGlobalConfig();
  let pinnedPort = cfg.port;
  if (typeof pinnedPort !== "number" || pinnedPort <= 0 || await isPortInUse(pinnedPort)) {
    pinnedPort = await findFreePort();
    setGlobalConfigPort(pinnedPort);
    console.log(`fewtok pinned port: ${pinnedPort} → ${paths.config()}`);
    console.log(`  add to shell rc: export ANTHROPIC_BASE_URL=http://127.0.0.1:${pinnedPort}`);
  } else {
    console.log(`fewtok port already pinned: ${pinnedPort}`);
  }

  mkdirSync(paths.projectDir(cwd), { recursive: true });
  const stub = { version: 1, aliases: [] };
  for (const f of [paths.projectPaths(cwd), paths.projectMacros(cwd)]) {
    if (!existsSync(f)) writeFileSync(f, JSON.stringify(stub, null, 2));
  }
  if (!existsSync(paths.projectConfig(cwd))) {
    writeFileSync(paths.projectConfig(cwd), JSON.stringify({
      codecs: { path: { enabled: true }, macro: { enabled: true } },
      read_cache: { enabled: true },
    }, null, 2));
  }
  if (!verbose) { console.log("ok"); } else { console.log(`fewtok project initialized at ${cwd}/.fewtok/`); }
  return 0;
}
