#!/bin/bash
# Stage-1 E2E monitor. Heartbeat every 120s. Exits at Stage-1 checkpoint (guides done + image plateau / cap hit)
# or scene-bulk reached, or max time. Emits one heartbeat line per poll (stdout).
export PGPASSWORD=theroad_dev_2026
EID=92910173-fd2c-46ad-9d60-2b02dead4c0c
PID=0e07d5e3-3fdd-4b9b-a54f-33aa59a5e204
PROJ=/Users/manta/Documents/Projects/TheRoad-I1/projects/$PID
Q(){ psql -h localhost -U theroad -d theroad -tA -c "$1" 2>/dev/null; }

prev_img=-1
prev_comp=-1
plateau=0
stall=0
for i in $(seq 1 75); do
  img=$(Q "SELECT count(*) FROM image_asset WHERE episode_id='$EID';")
  laststep=$(Q "SELECT step_id||':'||status FROM step_run WHERE episode_id='$EID' ORDER BY updated_at DESC LIMIT 1;")
  odl=$(Q "SELECT status FROM step_run WHERE episode_id='$EID' AND step_id='outdoor_site_layout';")
  sip=$(Q "SELECT status FROM step_run WHERE episode_id='$EID' AND step_id='scene_image_pipeline';")
  failed=$(Q "SELECT count(*) FROM step_run WHERE episode_id='$EID' AND status IN ('failed','partial');")
  ncomp=$(Q "SELECT count(*) FROM step_run WHERE episode_id='$EID' AND status='completed';")
  # newest png age (seconds)
  newpng=$(find "$PROJ" -name '*.png' -type f 2>/dev/null | xargs -r stat -f '%m %N' 2>/dev/null | sort -rn | head -1)
  now=$(date +%s)
  pngage="n/a"; pngname=""
  if [ -n "$newpng" ]; then mt=$(echo "$newpng"|awk '{print $1}'); pngage=$(( now - mt )); pngname=$(basename "$(echo "$newpng"|cut -d' ' -f2-)"); fi
  ts=$(date +%H:%M:%S)
  echo "[$ts] poll$i img=$img comp=$ncomp fail/part=$failed last=$laststep odl=${odl:-none} sip=${sip:-none} pngage=${pngage}s($pngname)"
  reached_guides=0
  [ "$odl" = "completed" ] || [ "$odl" = "partial" ] && reached_guides=1
  # plateau tracking (only meaningful once guides reached)
  if [ "$reached_guides" = "1" ] && [ "$img" = "$prev_img" ] && [ "$img" -gt "0" ]; then plateau=$((plateau+1)); else plateau=0; fi
  # stall detection: both completed-step count AND img frozen => possible hang
  if [ "$img" = "$prev_img" ] && [ "$ncomp" = "$prev_comp" ]; then stall=$((stall+1)); else stall=0; fi
  prev_img=$img
  prev_comp=$ncomp
  # exit: long stall (~30min no progress on steps or images) => wake me to investigate
  if [ "$stall" -ge "15" ]; then echo "EXIT stall_suspected img=$img comp=$ncomp last=$laststep (no progress ~30min)"; exit 0; fi
  # exit: reached scene bulk clearly
  if [ -n "$sip" ] && [ "$img" -gt "50" ]; then echo "EXIT reached_scene_bulk img=$img sip=$sip"; exit 0; fi
  # exit: guides done + image frozen 3 polls (~6min) => cap hit / halted
  if [ "$reached_guides" = "1" ] && [ "$plateau" -ge "3" ]; then echo "EXIT stage1_checkpoint_plateau img=$img (guides done, image gen halted ~cap)"; exit 0; fi
  sleep 120
done
echo "EXIT maxtime img=$prev_img"
exit 0
