#!/usr/bin/env node --redirect-warnings=/dev/null

const fs = require("fs");
const { randomBytes } = require("crypto");
const { execFileSync } = require("child_process");
const {
  minimizeTestPlan,
  buildTests,
  runTests,
} = require("./randomized-test-minimize");

const { ZED_SERVER_URL } = process.env;
if (!ZED_SERVER_URL) throw new Error("Missing env var `ZED_SERVER_URL`");

main();

async function main() {
  buildTests();

  const seed = randomU64();
  const commit = execFileSync("git", ["rev-parse", "HEAD"], {
    encoding: "utf8",
  }).trim();

  console.log("commit:", commit);
  console.log("starting seed:", seed);

  const planPath = "target/test-plan.json";
  const minPlanPath = "target/test-plan.min.json";
  const failingSeed = runTests({
    SEED: seed,
    SAVE_PLAN: planPath,
    ITERATIONS: 50000,
    OPERATIONS: 200,
  });

  if (!failingSeed) {
    console.log("tests passed");
    return;
  }

  console.log("found failure at seed", failingSeed);
  const minimizedSeed = minimizeTestPlan(planPath, minPlanPath);
  const minimizedPlan = fs.readFileSync(minPlanPath, "utf8");

  console.log("minimized plan:\n", minimizedPlan);

  const url = `${ZED_SERVER_URL}/api/randomized_test_failure`;
  const body = {
    seed: minimizedSeed,
    plan: JSON.parse(minimizedPlan),
    commit: commit,
  };
  await fetch(url, {
    method: "POST",
    headers: { "Content-Type": "application/json" },
    body: JSON.stringify(body),
  });

  process.exit(1);
}

function randomU64() {
  const bytes = randomBytes(8);
  const hexString = bytes.reduce(
    (string, byte) => string + byte.toString(16),
    "",
  );
  return BigInt("0x" + hexString).toString(10);
}
