#!/usr/bin/env bash
# Evidence driver for pingdotgg/t3code#23637 (issue #23372). Run inside headless-desktop:
#   headless-desktop bash /tmp/ev-23637/driver.sh <before|after> <seed|r1|r2|r3>
# seed: first fast boot on a throwaway home, clean quit, keep its statev2.sqlite as the
#       synthetic seed for that SHA. r1/r2/r3: rows from the brief, each on a fresh home
#       with the seed copied in. Synthetic data only; never touches ~/.t3.
set -u
export PATH="$HOME/.bun/bin:$HOME/.local/bin:$PATH"
for v in $(env | grep -o '^T3CODE_[A-Z_]*'); do unset "$v"; done
side=$1; row=$2
E=/tmp/ev-23637
case $side in
  before) wt=$E/wt-before; port=47811; cdp=9311;;
  after)  wt=/home/ubuntu/wt/pr-23637; port=47812; cdp=9312;;
  *) exit 2;;
esac
run=$row-$side; out=$E/runs/$run; home=$E/homes/$run
mkdir -p "$out" "$home/userdata" "$E/proj"
PIDS=$E/pids-capture.txt
track() { echo "$run $1 $2" >> "$PIDS"; }
ELECTRON=$wt/apps/desktop/node_modules/electron/dist/electron
cd "$wt/apps/desktop"

if [ "$row" != seed ]; then
  cp "$E/seed-$side/statev2.sqlite" "$home/userdata/statev2.sqlite"
fi
db=$home/userdata/statev2.sqlite

if [ "$row" = r1 ] || [ "$row" = r3 ]; then
  python3 -I "$E/pin.py" "$db" "$out/flag-pinned" > "$out/pin.log" 2>&1 & pinpid=$!; track sqlite-reader "$pinpid"
  while [ ! -e "$out/flag-pinned" ]; do sleep 0.3; done
fi

{ echo "run=$run head=$(git -C "$wt" rev-parse --short=10 HEAD) display=$DISPLAY home=$home port=$port cdp=$cdp";
  echo "electron $("$ELECTRON" --version 2>/dev/null) root=$(import -window root png:- | identify -format %wx%h -)"; } > "$out/env.txt"

ffmpeg -loglevel error -f x11grab -video_size 1920x1080 -framerate 10 -i "$DISPLAY" \
  -c:v libx264 -preset veryfast -crf 28 -pix_fmt yuv420p "$out/rec.mp4" & ffpid=$!; track ffmpeg "$ffpid"
sleep 1
t0=$(date +%s.%N); echo "$t0" > "$out/t0"
rel() { awk -v a="$(date +%s.%N)" -v b="$t0" 'BEGIN{printf "%6.1f", a-b}'; }
mark() { echo "t=$(rel) $*" | tee -a "$out/marks"; }
at() { sleep "$(awk -v t0="$t0" -v t="$1" -v n="$(date +%s.%N)" 'BEGIN{d=t0+t-n; print (d>0?d:0)}')"; }
shot() { import -window root "$out/still-$1.png"; mark "still $1"; }
launch_args=(dist-electron/main.cjs --no-sandbox --disable-gpu --remote-debugging-port=$cdp)

T3CODE_HOME=$home T3CODE_PORT=$port "$ELECTRON" "${launch_args[@]}" \
  > >(while IFS= read -r l; do echo "t=$(rel) $l"; done > "$out/electron.log") 2>&1 &
epid=$!; track electron-main "$epid"; mark "LAUNCH electron main pid $epid"

children() { cat /proc/"$1"/task/*/children 2>/dev/null; }
backend_pid() { for c in $(children "$epid"); do tr '\0' ' ' < /proc/$c/cmdline 2>/dev/null | grep -q 'bin.mjs' && { echo "$c"; return; }; done; }
pslist() { echo "--- $1 (t=$(rel))"; echo "electron main $epid alive=$(kill -0 $epid 2>/dev/null && echo yes || echo no)";
  for c in $(children "$epid"); do echo "child $c: $(tr '\0' ' ' < /proc/$c/cmdline 2>/dev/null | cut -c1-160)"; done; }
second_launch() {
  mark "SECOND LAUNCH (plain, same args/home)"
  T3CODE_HOME=$home T3CODE_PORT=$port "$ELECTRON" "${launch_args[@]}" > "$out/second.log" 2>&1 & spid=$!; track electron-second "$spid"
  wait "$spid"; mark "second instance exited code $?"
}
activate() {
  mark "ACTIVATE via control socket (t3 app --base-dir $home $E/proj)"
  (cd "$wt" && node apps/server/src/bin.ts app --base-dir "$home" "$E/proj") > "$out/activate.log" 2>&1 & apid=$!; track t3-app-cli "$apid"
}

case $row in
seed)
  for t in 2 6 10 15 20; do at $t; shot $t; done
  at 22; pslist pre-quit >> "$out/ps.txt"; mark "SIGTERM $epid"; kill -TERM "$epid"
  for i in $(seq 1 40); do kill -0 "$epid" 2>/dev/null || break; sleep 0.5; done; mark "electron alive=$(kill -0 $epid 2>/dev/null && echo yes || echo no)"
  mkdir -p "$E/seed-$side"; sqlite3 "$db" 'PRAGMA wal_checkpoint(TRUNCATE);' > /dev/null
  cp "$db" "$E/seed-$side/statev2.sqlite"; ls -la "$home/userdata" > "$out/userdata-ls.txt"
  ;;
r1)
  for t in 30 58; do at $t; shot $t; done
  at 62; shot 62; pslist t62 >> "$out/ps.txt"
  at 65; mark "CLOSE splash via CDP window.close()"; node "$E/cdp-close.mjs" "$cdp" > "$out/cdp-close.log" 2>&1; mark "cdp-close exit $? ($(tail -n 1 "$out/cdp-close.log" | cut -c1-200))"
  at 67; shot 67
  at 70; second_launch
  at 74; shot 74; curl -s "http://127.0.0.1:$cdp/json" > "$out/cdp-targets-t74.json"
  at 78; activate
  at 82; shot 82; curl -s "http://127.0.0.1:$cdp/json" > "$out/cdp-targets-t82.json"
  at 90; mark "RELEASE stall: kill reader $pinpid"; kill "$pinpid"; wait "$pinpid" 2>/dev/null
  for t in 93 96 100; do at $t; shot $t; done
  curl -s "http://127.0.0.1:$cdp/json" > "$out/cdp-targets-t100.json"
  at 102; pslist pre-quit >> "$out/ps.txt"
  ;;
r2)
  at 2; shot 2; second_launch; activate
  for t in 4 6 8 10 12 14 16 18 20; do at $t; shot $t; done
  curl -s "http://127.0.0.1:$cdp/json" > "$out/cdp-targets-t20.json"
  pslist pre-quit >> "$out/ps.txt"
  ;;
r3)
  for t in 30 62; do at $t; shot $t; done
  at 68; shot 68; be=$(backend_pid); pslist pre-sigterm >> "$out/ps.txt"; echo "backend child=$be" >> "$out/ps.txt"
  mark "SIGTERM electron main $epid (backend child $be)"; kill -TERM "$epid"
  for i in $(seq 1 20); do kill -0 "$epid" 2>/dev/null || break; sleep 0.5; done
  mark "electron main alive=$(kill -0 $epid 2>/dev/null && echo yes || echo no)"
  for i in $(seq 1 20); do [ -n "$be" ] && kill -0 "$be" 2>/dev/null || break; sleep 0.5; done
  mark "backend $be alive=$([ -n "$be" ] && kill -0 "$be" 2>/dev/null && echo yes || echo no)"
  at 78; shot 78; mark "electron alive=$(kill -0 $epid 2>/dev/null && echo yes || echo no) backend alive=$([ -n "$be" ] && kill -0 "$be" 2>/dev/null && echo yes || echo no)"
  { echo "--- post (t=$(rel))"; echo "processes whose parent is $epid or $be:"; ps -e -o pid=,ppid=,args= | awk -v a="$epid" -v b="$be" '$2==a||$2==b' | cut -c1-160; echo end; } >> "$out/ps.txt"
  at 82; shot 82
  ;;
esac

# Teardown: only PIDs this run started.
if kill -0 "$epid" 2>/dev/null; then mark "teardown SIGTERM $epid"; kill -TERM "$epid"; for i in $(seq 1 20); do kill -0 "$epid" 2>/dev/null || break; sleep 0.5; done; kill -0 "$epid" 2>/dev/null && kill -KILL "$epid"; fi
[ -n "${apid:-}" ] && kill -0 "$apid" 2>/dev/null && kill "$apid"
[ -n "${pinpid:-}" ] && kill -0 "$pinpid" 2>/dev/null && kill "$pinpid"
kill -INT "$ffpid"; wait "$ffpid" 2>/dev/null
grep -nE 'userdata|connecting splash|splash|backend ready|main window|window (created|shown|closed)|httpReadiness|timedOut|second.instance|activat|ready-to-show' "$out/electron.log" | cut -c1-240 > "$out/key-lines.txt"
mark "done"
