#!/usr/bin/env bash
# Cross-language byte-identical check for db-23.
# Builds dbctl in all three languages and confirms each scenario's
# SHA-256 matches the frozen golden.
set -euo pipefail
HERE="$(cd "$(dirname "$0")" && pwd)"
ROOT="$(cd "$HERE/.." && pwd)"

GOLDEN_NORMAL="5976b45b9f40f440e8249da27fe4fe752e005f606efc3596bdb25ca4e4f99296"
GOLDEN_FAULT="d67c36725af65242e985a308db5152af2a3e2525fab33d11ed6e826a252ff792"

echo "--- build rust ---"
( cd "$ROOT/src/rust" && cargo build --release --quiet )
RUST_BIN="$ROOT/src/rust/target/release/dbctl"

echo "--- build go ---"
GO_BIN="$ROOT/src/go/dbctl_go"
( cd "$ROOT/src/go" && go build -o "$GO_BIN" ./cmd/dbctl )

echo "--- build cpp ---"
(
  cd "$ROOT/src/cpp"
  cmake -S . -B build -DCMAKE_BUILD_TYPE=Release >/dev/null
  cmake --build build -j >/dev/null
)
CPP_BIN="$ROOT/src/cpp/build/dbctl"

check_scenario() {
  local name="$1"; local seed="$2"; local ops="$3"; local keys="$4"; local scen="$5"; local golden="$6"
  local rh gh ch
  rh="$("$RUST_BIN" hash workload --seed "$seed" --ops "$ops" --keys "$keys" --scenario "$scen")"
  gh="$("$GO_BIN"   hash workload --seed "$seed" --ops "$ops" --keys "$keys" --scenario "$scen")"
  ch="$("$CPP_BIN"  hash workload --seed "$seed" --ops "$ops" --keys "$keys" --scenario "$scen")"
  echo "[$name] rust=$rh"
  echo "[$name] go  =$gh"
  echo "[$name] cpp =$ch"
  echo "[$name] gold=$golden"
  if [[ "$rh" != "$gh" || "$gh" != "$ch" || "$rh" != "$golden" ]]; then
    echo "MISMATCH in $name"; exit 1
  fi
}

check_scenario normal 42 200  16  normal "$GOLDEN_NORMAL"
check_scenario fault  7  2000 128 fault  "$GOLDEN_FAULT"

rm -f "$GO_BIN"
echo "=== ALL OK ==="
