#!/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, ZED_CLIENT_SECRET_TOKEN} = process.env
if (!ZED_SERVER_URL) throw new Error('Missing env var `ZED_SERVER_URL`')
if (!ZED_CLIENT_SECRET_TOKEN) throw new Error('Missing env var `ZED_CLIENT_SECRET_TOKEN`')

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,
    token: ZED_CLIENT_SECRET_TOKEN,
    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)
}