#!/usr/bin/env bash
# lib/ocaml/baseline/run.sh — run each baseline OCaml program through
# ocaml-run-program and compare to expected.json.

set -uo pipefail
cd "$(git rev-parse --show-toplevel)"

SX_SERVER="${SX_SERVER:-hosts/ocaml/_build/default/bin/sx_server.exe}"
if [ ! -x "$SX_SERVER" ]; then
  SX_SERVER="/root/rose-ash/hosts/ocaml/_build/default/bin/sx_server.exe"
fi

PASS=0
FAIL=0
ERRORS=""

for f in lib/ocaml/baseline/*.ml; do
  name=$(basename "$f")
  expected=$(grep -oE "\"$name\"[[:space:]]*:[[:space:]]*[0-9-]+" lib/ocaml/baseline/expected.json | sed -E 's/.*:[[:space:]]*//')
  if [ -z "$expected" ]; then
    continue
  fi

  TMP=$(mktemp)
  cat > "$TMP" << EOF
(epoch 1)
(load "lib/guest/lex.sx")
(load "lib/guest/prefix.sx")
(load "lib/guest/pratt.sx")
(load "lib/ocaml/tokenizer.sx")
(load "lib/ocaml/parser.sx")
(load "lib/ocaml/eval.sx")
(load "lib/ocaml/runtime.sx")
(eval "(ocaml-load-stdlib!)")
(epoch 2)
(eval "(ocaml-run-program (file-read \"$f\"))")
EOF

  output=$(timeout 480 "$SX_SERVER" < "$TMP" 2>/dev/null)
  rm -f "$TMP"

  result=$(echo "$output" | awk '
    /^\(ok-len 2 / { getline; print; exit }
    /^\(ok 2 [^)]+\)$/ { sub(/^\(ok 2 /, ""); sub(/\)$/, ""); print; exit }
  ')

  if [ "$result" = "$expected" ]; then
    PASS=$((PASS + 1))
    echo "  ok $name → $result"
  else
    FAIL=$((FAIL + 1))
    ERRORS+="  FAIL $name expected=$expected got=$result
"
  fi
done

TOTAL=$((PASS + FAIL))
if [ $FAIL -eq 0 ]; then
  echo "ok $PASS/$TOTAL baseline OCaml programs run correctly"
else
  echo "FAIL $PASS/$TOTAL baseline programs"
  echo "$ERRORS"
fi
[ $FAIL -eq 0 ]
