#!/bin/bash
# Stage-2 E2E monitor. Heartbeat every 120s. Exits when scene_image_pipeline completes,
# or run halts (cap/fail with no running step), or long stall, or maxtime.
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; stall=0
for i in $(seq 1 90); do
  img=$(Q "SELECT count(*) FROM image_asset WHERE episode_id='$EID';")
  stills=$(Q "SELECT count(*) FROM image_asset WHERE episode_id='$EID' AND asset_type='scene';")
  laststep=$(Q "SELECT step_id||':'||status FROM step_run WHERE episode_id='$EID' ORDER BY updated_at DESC LIMIT 1;")
  sip=$(Q "SELECT status FROM step_run WHERE episode_id='$EID' AND step_id='scene_image_pipeline';")
  running=$(Q "SELECT count(*) FROM step_run WHERE episode_id='$EID' AND status='running';")
  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';")
  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] p$i img=$img stills=$stills comp=$ncomp run=$running fail/part=$failed sip=${sip:-none} last=$laststep pngage=${pngage}s($pngname)"
  # exit: scene image pipeline completed => full E2E done
  if [ "$sip" = "completed" ]; then echo "EXIT scene_image_pipeline_completed img=$img stills=$stills"; exit 0; fi
  # stall detection: only if img+comp frozen AND no fresh png (mtime>600s = truly quiet).
  # background_render writes to background_chain (not image_asset), so png mtime is the liveness signal.
  pngstale=1
  if [ "$pngage" != "n/a" ] && [ "$pngage" -lt "600" ]; then pngstale=0; fi
  if [ "$img" = "$prev_img" ] && [ "$ncomp" = "$prev_comp" ] && [ "$pngstale" = "1" ]; then stall=$((stall+1)); else stall=0; fi
  prev_img=$img; prev_comp=$ncomp
  if [ "$stall" -ge "10" ]; then echo "EXIT stall_suspected img=$img comp=$ncomp last=$laststep pngage=${pngage}s (no img/step/png progress ~20min)"; exit 0; fi
  # exit: run halted (no running step) after sip reached a terminal non-completed state
  if [ "$running" = "0" ] && [ -n "$sip" ] && [ "$sip" != "running" ] && [ "$sip" != "completed" ] && [ "$i" -gt "2" ]; then
    echo "EXIT run_halted sip=$sip img=$img (likely cap or fail — inspect)"; exit 0; fi
  sleep 120
done
echo "EXIT maxtime img=$prev_img"
exit 0
