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

# Prerequisites: a dictionary-capable Enterprise weed binary, Python 3, curl.
# Use an empty lab directory. Every service binds to loopback on its own ports.
LAB_DIR=${1:?Usage: WEED=/path/to/weed ./run.sh /absolute/path/to/new-lab}
WEED=${WEED:-weed}
SCRIPT_DIR=$(cd -- "$(dirname -- "${BASH_SOURCE[0]}")" && pwd)
mkdir -p "$LAB_DIR/data" "$LAB_DIR/evidence"
if [[ -e "$LAB_DIR/cluster" ]]; then
  echo 'Use a fresh lab directory: cluster already exists.' >&2
  exit 1
fi
for port in 9533 19533 8280 18280 9088 19088 8533 18533 6071 23746 33746; do
  if ss -ltnH | awk '{print $4}' | grep -q ":${port}$"; then
    echo "Port $port is already in use." >&2
    exit 1
  fi
done
if [[ "$(command -v "$WEED")" != "$LAB_DIR/weed" ]]; then
  cp "$(command -v "$WEED")" "$LAB_DIR/weed"
fi
: "${SOURCE_COMMIT:=unknown}"
printf '%s\n' "$SOURCE_COMMIT" > "$LAB_DIR/source-commit.txt"
python3 -m venv "$LAB_DIR/venv"
"$LAB_DIR/venv/bin/pip" -q install boto3==1.42.0
curl -fLsS https://data.gharchive.org/2025-01-01-0.json.gz -o "$LAB_DIR/data/2025-01-01-0.json.gz"
cat > "$LAB_DIR/s3.json" <<'JSON'
{"identities":[{"name":"blog","credentials":[{"accessKey":"blog","secretKey":"blog-secret"}],"actions":["Admin"]}]}
JSON
mkdir "$LAB_DIR/cluster"
cd "$LAB_DIR"
./weed mini -dir="$LAB_DIR/cluster" -ip=127.0.0.1 -ip.bind=127.0.0.1 \
  -master.port=9533 -volume.port=8280 -filer.port=9088 -s3.port=8533 \
  -s3.port.iceberg=0 -s3.port.lance=0 -s3.config="$LAB_DIR/s3.json" \
  -admin.ui=false -admin.port=23746 -admin.port.grpc=33746 -admin.port.legacy=0 -webdav=false -debug.port=6071 -master.telemetry=false \
  -compression.method=zstd -compression.level=1 > "$LAB_DIR/evidence/cluster.log" 2>&1 &
CLUSTER_PID=$!
printf '%s\n' "$CLUSTER_PID" > "$LAB_DIR/cluster.pid"
if [[ "${KEEP_RUNNING:-0}" != 1 ]]; then
  trap 'kill "$CLUSTER_PID" 2>/dev/null || true' EXIT
fi
for attempt in $(seq 1 90); do
  if curl -fsS http://127.0.0.1:9088/ > /dev/null 2>&1; then break; fi
  sleep 1
done
curl -fsS http://127.0.0.1:9088/ > /dev/null
for phase in prepare seed measure report; do
  "$LAB_DIR/venv/bin/python" "$SCRIPT_DIR/benchmark.py" "$phase" --root "$LAB_DIR" \
    2>&1 | tee "$LAB_DIR/evidence/$phase.log"
done
echo "Results: $LAB_DIR/evidence/report.html"
