#!/usr/bin/env bash
# Driver for PR #23605 runtime evidence. Usage: driver.sh <row> <side>
set -u
for v in $(env | grep -o '^T3CODE_[A-Z_]*'); do unset "$v"; done
EV=/tmp/ev-23605; BIN=$EV/bin; PORT=18638
ROW=$1; SIDE=$2
case $SIDE in before) CO=/home/ubuntu/wt/pr-23605-before ;; after) CO=/home/ubuntu/wt/pr-23605 ;; esac
D=$EV/$ROW-$SIDE; rm -rf "$D"; mkdir -p "$D/base"; : > "$D/calls.log"
stamp() { while IFS= read -r l; do printf '%s %s\n' "$(date +%T.%3N)" "$l"; done; }
note() { printf '%s DRIVER %s\n' "$(date +%T.%3N)" "$*" | tee -a "$D/driver.log"; }
snap() { note "serve status ($1):"; { /usr/bin/tailscale serve status --json 2>&1 || sudo -n /usr/bin/tailscale serve status --json; } | tee "$D/serve-$1.json" | tee -a "$D/driver.log"; }
calls() { grep -c . "$D/calls.log"; }
wait_calls() { local n=$1 max=$2 t=0; while [ "$(calls)" -lt "$n" ] && [ $t -lt $((max*10)) ]; do sleep 0.1; t=$((t+1)); done; }
wait_log() { local pat=$1 max=$2 t=0; while ! grep -q "$pat" "$D/server.log" && [ $t -lt $((max*10)) ]; do sleep 0.1; t=$((t+1)); done; }
op() { sudo -n /usr/bin/tailscale set --operator="$1"; note "operator set to '${1}': $(sudo -n /usr/bin/tailscale debug prefs | grep -i operator || echo '(empty)')"; }
case $ROW in R1c) MODE=nosock ;; R1b) MODE=notloggedin ;; *) MODE=real ;; esac
ss -H -ltn "sport = :$PORT" | grep -q . && { note "port $PORT busy"; exit 1; }
note "row=$ROW side=$SIDE mode=$MODE checkout=$CO sha=$(git -C "$CO" rev-parse HEAD)"
[ "$ROW" = R5 ] && op ubuntu
snap start
cd "$CO"
env PATH="$BIN:$PATH" MODE=$MODE EV_ROW_DIR="$D" node apps/server/src/bin.ts serve --tailscale-serve --tailscale-serve-port 18443 --port $PORT --host 127.0.0.1 --base-dir "$D/base" --no-browser > >(stamp > "$D/server.log") 2>&1 &
PID=$!; echo $PID > "$D/pid"; note "spawned server pid=$PID"
case $ROW in
  R1c|R1b)
    sleep 40; snap 40s
    op ubuntu; touch "$D/up"; note "touched up flag"
    wait_log "Tailscale Serve configured" 45; sleep 1; snap after-fix ;;
  R2)
    if [ "$SIDE" = after ]; then wait_calls 6 45; note "6th serve call seen"; sleep 2; else sleep 40; fi
    snap 40s ;;
  R5)
    wait_log "Tailscale Serve configured" 30; sleep 2; snap configured ;;
  R1a)
    sleep 20; snap 20s; op ubuntu; note "granted operator"
    wait_log "Tailscale Serve configured" 45; sleep 1; snap after-fix ;;
esac
CALLS_AT_TERM=$(calls)
note "SIGTERM pid=$PID (calls so far: $CALLS_AT_TERM)"; kill -TERM "$PID"
t=0; while kill -0 "$PID" 2>/dev/null && [ $t -lt 300 ]; do sleep 0.1; t=$((t+1)); done
if kill -0 "$PID" 2>/dev/null; then note "pid $PID still alive after 30s; SIGKILL"; kill -KILL "$PID"; else note "server pid=$PID exited"; fi
sleep 1
note "calls after SIGTERM: $(( $(calls) - CALLS_AT_TERM ))"
snap after-sigterm
case $ROW in R1c|R1b|R5|R1a) op "" ;; esac
