#!/usr/bin/env bash

set -euo pipefail

ROOT="$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)"
REPOSITORY="$(git -C "${ROOT}" rev-parse --show-toplevel)"
COMMIT="${1:-HEAD}"
RESOLVED_COMMIT="$(git -C "${REPOSITORY}" rev-parse "${COMMIT}^{commit}")"
OUTPUT="${ROOT}/results/clean-export"
TEMPORARY="$(mktemp -d)"
readonly ROOT REPOSITORY COMMIT RESOLVED_COMMIT OUTPUT TEMPORARY

cleanup() {
  if [[ -n "${TEMPORARY}" && -d "${TEMPORARY}" ]]; then
    rm -rf "${TEMPORARY}"
  fi
}
trap cleanup EXIT

mkdir -p "${OUTPUT}"
printf 'git archive %q editorial/reproductions/evt-03 | tar -x\n' \
  "${RESOLVED_COMMIT}" >"${OUTPUT}/command.txt"

git -C "${REPOSITORY}" archive \
  "${RESOLVED_COMMIT}" editorial/reproductions/evt-03 \
  | tar -x -C "${TEMPORARY}"

EXPORTED="${TEMPORARY}/editorial/reproductions/evt-03"
readonly EXPORTED

"${EXPORTED}/run.sh" >"${OUTPUT}/output.txt.tmp" 2>&1
php "${EXPORTED}/verify-results.php" >>"${OUTPUT}/output.txt.tmp"

clean_verifier="$(sha256sum \
  "${EXPORTED}/results/verification/results/output.txt" | cut -d' ' -f1)"
working_verifier="$(sha256sum \
  "${ROOT}/results/verification/results/output.txt" | cut -d' ' -f1)"
clean_crash="$(sha256sum \
  "${EXPORTED}/results/behavior/crash-after-acceptance/evidence.json" \
  | cut -d' ' -f1)"
working_crash="$(sha256sum \
  "${ROOT}/results/behavior/crash-after-acceptance/evidence.json" \
  | cut -d' ' -f1)"
clean_metrics="$(sha256sum \
  "${EXPORTED}/results/behavior/operational-snapshot/evidence.json" \
  | cut -d' ' -f1)"
working_metrics="$(sha256sum \
  "${ROOT}/results/behavior/operational-snapshot/evidence.json" \
  | cut -d' ' -f1)"

if [[ "${clean_verifier}" != "${working_verifier}" ]]; then
  echo "clean verifier differs from retained verifier" >&2
  exit 1
fi

if [[ "${clean_crash}" != "${working_crash}" ]]; then
  echo "clean crash evidence differs from retained evidence" >&2
  exit 1
fi

if [[ "${clean_metrics}" != "${working_metrics}" ]]; then
  echo "clean metrics evidence differs from retained evidence" >&2
  exit 1
fi

{
  printf 'resolved_commit=%s\n' "${RESOLVED_COMMIT}"
  printf 'clean_verifier_sha256=%s\n' "${clean_verifier}"
  printf 'crash_after_acceptance_sha256=%s\n' "${clean_crash}"
  printf 'operational_snapshot_sha256=%s\n' "${clean_metrics}"
  printf 'exit_code=0\n'
} >"${OUTPUT}/metadata.txt"

sed -E -e 's/[[:space:]]+$//' -e '${/^$/d;}' \
  "${OUTPUT}/output.txt.tmp" >"${OUTPUT}/output.txt"
rm "${OUTPUT}/output.txt.tmp"

echo "Clean export verified at ${RESOLVED_COMMIT}"
