#!/bin/bash
# scene_image_pipeline 한 스텝만 모는 운전 루프 — run-all 을 쓰지 않는다.
#
# run-all 은 지금 scene_detail 의 invariant drift(S92) BLOCK 을 다시 밟는다
# (별도 과제로 남김). 이 루프의 규칙 셋:
#   · 돌고 있으면 둔다 (활동 없음 회수는 autodrive 몫 — 여기선 안 죽인다).
#   · completed 로 끝나면 물증(파일 수·최신 mtime)을 찍고 종료한다.
#   · failed/partial 로 멈추면 resume 을 최대 3회 다시 건다. 그래도 그
#     상태면 사람이 봐야 한다 — 더 부르면 돈만 나간다. force 는 절대 안 쓴다.
set -u
P=e716bafb-24bb-42b7-aea0-fdb383844ee8
E=d6a9aa85-b75e-400c-980c-4ee7e876a15b
BASE=http://localhost:8000/api/v1/projects/$P/episodes/$E
STEP=scene_image_pipeline
TRIES=0
MAX_TRIES=3
IMG_DIR=../projects/$P/images/$E/scene/recipe

relogin() {
  curl -s -c /tmp/th_drive.cookie -X POST \
    http://localhost:8000/api/v1/auth/login \
    -H 'Content-Type: application/json' \
    -d '{"username":"admin","password":"admin123"}' -o /dev/null
}
say() { echo "$(date +%H:%M:%S) $*"; }

relogin
while true; do
  ST=$(PGPASSWORD=theroad_dev_2026 psql -h localhost -U theroad -d theroad -t -A -c \
    "SELECT status||'|'||coalesce(completed_count,0)||'/'||coalesce(applicable_count,0) \
     FROM step_run WHERE episode_id='$E' AND step_id='$STEP';" 2>/dev/null)
  case "$ST" in
    running*) say "진행 중 $ST";;
    completed*)
      N=$(ls "$IMG_DIR" 2>/dev/null | wc -l | tr -d ' ')
      say "완료 $ST — 물증: recipe 파일 ${N}개, 최신 5개:"
      ls -lt "$IMG_DIR" | head -6
      exit 0;;
    failed*|partial*)
      if [ "$TRIES" -ge "$MAX_TRIES" ]; then
        say "★사람이 봐야 한다 — $ST 를 ${MAX_TRIES}회 재개해도 그대로다. 더 부르지 않는다."
        exit 1
      fi
      TRIES=$((TRIES+1))
      say "$ST — resume 재개 [$TRIES/$MAX_TRIES]"
      relogin
      curl -s -b /tmp/th_drive.cookie -X POST "$BASE/steps/$STEP?mode=resume" \
        -o /dev/null -w "  재개 HTTP %{http_code}\n";;
    "") say "상태 조회 실패 — 재시도";;
    *) say "예상 밖 상태: $ST — 판단 보류";;
  esac
  sleep 60
done
