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

ROOT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)"
ARTIFACTS_DIR="${ARTIFACTS_DIR:-$ROOT_DIR/artifacts}"
CASE="${CASE:-runtime_unique_ann}"
PROFILE_SECONDS="${BENCH_STEADY_STATE_SECONDS:-10}"
TRACE_OUT="${TRACE_OUT:-$ARTIFACTS_DIR/vector_ann_attach_${CASE}.trace}"
TOC_OUT="${TOC_OUT:-$ARTIFACTS_DIR/vector_ann_attach_${CASE}_toc.xml}"
PROFILE_LOG="${PROFILE_LOG:-$ARTIFACTS_DIR/vector_ann_attach_${CASE}.log}"
SYNC_DIR="${SYNC_DIR:-$ARTIFACTS_DIR/vector_ann_attach_sync_${CASE}}"
READY_FILE="$SYNC_DIR/ready"
START_FILE="$SYNC_DIR/start"

mkdir -p "$ARTIFACTS_DIR"
rm -rf "$SYNC_DIR"
mkdir -p "$SYNC_DIR"
cd "$ROOT_DIR"

case "$CASE" in
  runtime_unique_ann)
    cargo bench --bench vector_ann -- prepare_runtime_unique_ann_store >/dev/null
    ;;
  runtime_ambiguous_fallback)
    cargo bench --bench vector_ann -- prepare_runtime_ambiguous_fallback_store >/dev/null
    ;;
  runtime_scan_f32)
    cargo bench --bench vector_ann -- prepare_runtime_scan_f32_store >/dev/null
    ;;
  runtime_scan_quantized_i8)
    cargo bench --bench vector_ann -- prepare_runtime_scan_quantized_i8_store >/dev/null
    ;;
  *)
    echo "unknown CASE: $CASE" >&2
    exit 1
    ;;
esac

PROFILE_READY_FILE="$READY_FILE" \
PROFILE_START_FILE="$START_FILE" \
BENCH_STEADY_STATE_SECONDS="$PROFILE_SECONDS" \
CARGO_PROFILE_RELEASE_DEBUG="${CARGO_PROFILE_RELEASE_DEBUG:-true}" \
  cargo run --release --bin vector_ann_attach_profile -- "$CASE" >"$PROFILE_LOG" 2>&1 &
target_pid=$!

cleanup() {
  if kill -0 "$target_pid" >/dev/null 2>&1; then
    kill "$target_pid" >/dev/null 2>&1 || true
  fi
}
trap cleanup EXIT

for _ in $(seq 1 500); do
  if [[ -f "$READY_FILE" ]]; then
    break
  fi
  sleep 0.1
done

if [[ ! -f "$READY_FILE" ]]; then
  echo "profile helper did not become ready" >&2
  exit 1
fi

xcrun xctrace record \
  --template 'Time Profiler' \
  --attach "$target_pid" \
  --output "$TRACE_OUT" \
  --time-limit "${PROFILE_SECONDS}s" \
  --no-prompt &
record_pid=$!

sleep 2
touch "$START_FILE"

wait "$record_pid"
wait "$target_pid"
trap - EXIT

xcrun xctrace export --input "$TRACE_OUT" --toc --output "$TOC_OUT"

echo "vector_ann_attach_trace: $TRACE_OUT"
echo "vector_ann_attach_toc: $TOC_OUT"
echo "vector_ann_attach_log: $PROFILE_LOG"
