#!/usr/bin/env bash
set -euo pipefail

ROOT="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
FASM_BIN="${FASM_BIN:-$(command -v fasm)}"
SETDB_BIN="${SETDB_BIN:-$(command -v setdb || true)}"
[[ -n "$SETDB_BIN" ]] || SETDB_BIN=/tmp/aiq-setdb-bin
WORK="$(mktemp -d "${TMPDIR:-/tmp}/aiq-store-mutants.XXXXXX")"
trap 'rm -rf "$WORK"' EXIT

mutants=(history_rewrite position_regression duplicate_event_id partial_batch output_without_checkpoint checkpoint_without_output conflict_changes_state append_batch_as_one)
for mutant in "${mutants[@]}"; do
  (cd "$ROOT" && "$FASM_BIN" "mutant_${mutant}.asm" "$WORK/$mutant" >/dev/null)
  "$WORK/$mutant" >"$WORK/$mutant.facts"
  "$SETDB_BIN" new "$WORK/$mutant.db"
  "$SETDB_BIN" load "$WORK/$mutant.db" "$WORK/$mutant.facts"
  post="$("$SETDB_BIN" range "$WORK/$mutant.db" STransition)"
  "$SETDB_BIN" add "$WORK/$mutant.db" SPost __empty__
  "$SETDB_BIN" remove "$WORK/$mutant.db" SPost __empty__
  while IFS= read -r state; do
    [[ -n "$state" ]] && "$SETDB_BIN" add "$WORK/$mutant.db" SPost "$state"
  done <<<"$post"
  violations="$("$SETDB_BIN" diff "$WORK/$mutant.db" SPost SInv | awk 'NF {n++} END {print n+0}')"
  if ((violations == 0)); then
    echo "STORE_MUTANT_SURVIVED mutant=$mutant" >&2
    exit 1
  fi
  echo "STORE_MUTANT_KILLED mutant=$mutant violations=$violations"
done
echo "STORE_MUTATION_MATRIX_PASS mutants=${#mutants[@]}"
