#!/usr/bin/env bash
# Deep public-data selfcheck over one isolated Store RPC server and its restart.
# Sealed snapshot/reload/cutover/TLS-listener checks live with their control
# channel and are intentionally not simulated through the public socket.
set -uo pipefail

HERE="$(cd "$(dirname "$0")/.." && pwd)"
[[ " ${*:-} " == *" --deep "* ]] || {
  echo "usage: store selfcheck --deep" >&2
  exit 2
}

SCRATCH="$(mktemp -d "${TMPDIR:-/tmp}/beagle-store-doctor.XXXXXX")"
PID=
PORT=
cleanup() {
  local rc=$?
  if [[ -n "$PID" ]] && kill -0 "$PID" 2>/dev/null; then
    kill -TERM "$PID" 2>/dev/null || true
    for _ in $(seq 1 60); do kill -0 "$PID" 2>/dev/null || break; sleep 0.1; done
    kill -9 "$PID" 2>/dev/null || true
    wait "$PID" 2>/dev/null || true
  fi
  rm -rf "${SCRATCH:?}"
  exit "$rc"
}
trap cleanup EXIT INT TERM

free_port() {
  local start="${1:-8200}" p
  for p in $(seq "$start" 8999); do
    if ! (exec 3<>"/dev/tcp/127.0.0.1/$p") 2>/dev/null; then echo "$p"; return 0; fi
  done
  return 1
}
PORT="$(free_port 8200)" || exit 1
DEAD="$(free_port $((PORT + 1)))" || exit 1
SPACE="beagle-store-doctor"
LOG="$SCRATCH/history.storelog"

start_server() {
  BEAGLE_STORE_BIND=127.0.0.1 BEAGLE_STORE_SPACE_ID="$SPACE" \
    "$HERE/bin/beagle-store-server" serve "$PORT" "$LOG" \
    >"$SCRATCH/server.out" 2>"$SCRATCH/server.err" &
  PID=$!
}
wait_port() {
  for _ in $(seq 1 180); do
    kill -0 "$PID" 2>/dev/null || return 1
    if (exec 3<>"/dev/tcp/127.0.0.1/$PORT") 2>/dev/null; then
      exec 3>&- 3<&-
      return 0
    fi
    sleep 0.1
  done
  return 1
}
stop_server() {
  kill -TERM "$PID" 2>/dev/null || true
  for _ in $(seq 1 100); do kill -0 "$PID" 2>/dev/null || break; sleep 0.05; done
  if kill -0 "$PID" 2>/dev/null; then return 1; fi
  wait "$PID" 2>/dev/null || true
  PID=
}

start_server
if ! wait_port; then
  echo "  [FAIL] socket server did not bind" >&2
  sed -n '1,160p' "$SCRATCH/server.err" >&2
  exit 1
fi

live_port="$PORT"
[[ "${BEAGLE_STORE_SELFCHECK_FAULT:-}" != "socket" ]] || live_port="$DEAD"
BEAGLE_STORE_SC_PHASE=live BEAGLE_STORE_SC_PORT="$live_port" BEAGLE_STORE_SC_SPACE="$SPACE" \
  bb -cp "$HERE/out" "$HERE/bin/beagle-store-doctor-probe.clj"
live_rc=$?

if ! stop_server; then
  echo "  [FAIL] restart old server did not stop" >&2
  exit 1
fi
start_server
if ! wait_port; then
  echo "  [FAIL] restart server did not bind" >&2
  exit 1
fi
BEAGLE_STORE_SC_PHASE=restart BEAGLE_STORE_SC_PORT="$PORT" BEAGLE_STORE_SC_SPACE="$SPACE" \
  bb -cp "$HERE/out" "$HERE/bin/beagle-store-doctor-probe.clj"
restart_rc=$?

if [[ $live_rc -eq 0 && $restart_rc -eq 0 ]]; then
  echo "selfcheck --deep: 7/7 PASS"
  exit 0
fi
echo "selfcheck --deep: FAILED" >&2
exit 1
