import { createHash } from "node:crypto";
import { chmod, readFile, writeFile } from "node:fs/promises";
import { gzipSync } from "node:zlib";

function option(name: string): string {
  const index = Bun.argv.indexOf(name);
  const value = index >= 0 ? Bun.argv[index + 1] : undefined;
  if (value === undefined || value.length === 0 || value.startsWith("--")) throw new Error(`${name} requires a value`);
  return value;
}

async function main(): Promise<void> {
  const inputPath = option("--input");
  const outputPath = option("--output");
  const source = await readFile(inputPath);
  JSON.parse(source.toString("utf8"));
  const compressed = gzipSync(source, { level: 9 });
  const payload = `${JSON.stringify({ confirm: true, snapshotGzipBase64: compressed.toString("base64") })}\n`;
  await writeFile(outputPath, payload, { encoding: "utf8", mode: 0o600 });
  await chmod(outputPath, 0o600);
  process.stdout.write(`${JSON.stringify({
    ok: true,
    output: outputPath,
    sourceBytes: source.length,
    compressedBytes: compressed.length,
    requestBytes: Buffer.byteLength(payload),
    sourceSha256: createHash("sha256").update(source).digest("hex"),
  })}\n`);
}

if (import.meta.main && !process.execArgv.includes("--check")) {
  main().catch((error) => {
    process.stderr.write(`${error instanceof Error ? error.message : String(error)}\n`);
    process.exitCode = 1;
  });
}
