import { writeFile } from "node:fs/promises";
import { join } from "node:path";
import type { ExitStatus } from "../exit-status.js";
import { writeMachineLog } from "../machine-output.js";
import type { IoContext } from "./verify.js";

const INIT_CONFIG = {
  schemaVersion: "config/v1",
  surfaces: [],
  matrix: { dimensions: {} },
  journeys: [],
  invariants: [],
  acceptedFindings: { store: ".invariantum/decisions" },
  credentials: { adapters: [] },
} as const;

export async function runInit(io: IoContext): Promise<ExitStatus> {
  const path = join(io.cwd, "invariantum.config.json");
  try {
    await writeFile(path, `${JSON.stringify(INIT_CONFIG, null, 2)}\n`, { encoding: "utf8", flag: "wx" });
  } catch (error) {
    const message = error instanceof Error ? error.message : "failed to initialize project state";
    writeMachineLog(`init failed: ${message}`, io.stderr);
    writeMachineLog("Remove or rename an existing invariantum.config.json before rerunning invariantum init.", io.stderr);
    return 2;
  }
  writeMachineLog(`initialized ${path}`, io.stderr);
  return 0;
}
