#!/usr/bin/env bash

set -euo pipefail
ROOT="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
readonly ROOT RESULTS="${ROOT}/results" IMAGE="serein-svc-02-node"
cd "${ROOT}"

milliseconds() {
  perl -MTime::HiRes=time -e 'printf "%.0f\n", time * 1000'
}

capture() {
  local name="$1" expectation="$2"
  shift 2
  local directory="${RESULTS}/${name}" started finished exit_code
  mkdir -p "${directory}"
  printf '%q ' "$@" | sed -E 's/[[:space:]]+$//' >"${directory}/command.txt"
  printf '\n' >>"${directory}/command.txt"
  started="$(milliseconds)"
  set +e
  "$@" >"${directory}/output.txt.tmp" 2>&1
  exit_code=$?
  set -e
  finished="$(milliseconds)"
  sed -E -e 's/[[:space:]]+$//' -e '${/^$/d;}' \
    "${directory}/output.txt.tmp" >"${directory}/output.txt"
  rm "${directory}/output.txt.tmp"
  printf 'expectation=%s\nexit_code=%s\nduration_ms=%s\n' \
    "${expectation}" "${exit_code}" "$((finished - started))" \
    >"${directory}/metadata.txt"
  [[ "${expectation}" == pass && ${exit_code} -eq 0 ]] || \
    [[ "${expectation}" == fail && ${exit_code} -ne 0 ]]
}

mutation_case() {
  local name="$1" temporary
  temporary="$(mktemp -d)"
  capture "mutations/${name}/generate" pass node mutate.mjs "${name}" "${temporary}"
  capture "diffs/${name}" fail diff -u \
    --label "analysis (clean)" --label "analysis (${name})" \
    "${temporary}/analysis.clean.json" "${temporary}/analysis.mutated.json"
  capture "negative/${name}" fail docker run --rm \
    --volume "${temporary}:/candidate:ro" "${IMAGE}" \
    node verify.mjs /candidate/analysis.mutated.json
  rm -rf "${temporary}"
}

rm -rf "${RESULTS}"
mkdir -p "${RESULTS}"
capture setup/build pass docker build --tag "${IMAGE}" .
capture environment/node pass docker run --rm "${IMAGE}" node --version
capture positive/tests pass docker run --rm "${IMAGE}" node --test tests/*.test.mjs
capture analysis/boundary pass docker run --rm "${IMAGE}" node verify.mjs
capture analysis/comparison pass docker run --rm "${IMAGE}" node render-comparison.mjs
for mutation in \
  MUT-01 MUT-02 MUT-03 MUT-04 MUT-05 MUT-06 MUT-07 MUT-08 MUT-09 \
  MUT-10 MUT-11 MUT-12 MUT-13 MUT-14 MUT-15 MUT-16 MUT-17 MUT-18; do
  mutation_case "${mutation}"
done
capture sources/primary pass docker run --rm "${IMAGE}" node source-evidence.mjs
capture provenance/manifest pass docker run --rm "${IMAGE}" node source-manifest.mjs
capture verification/results pass docker run --rm \
  --volume "${RESULTS}:/experiment/results:ro" "${IMAGE}" \
  node verify-results.mjs
echo "SVC-02 evidence retained in ${RESULTS}"
