#!/bin/bash
# ★★보관용이다 — 새 주행에 그대로 쓰지 마라 (2026-08-20).
#   drive_last2.sh 머리말과 같은 이유 셋: 완주 종료가 없어 끝나도 재개를
#   영원히 보낸다 · 이 판이 겨누는 last1 은 완주·배포된 판이라 지금 설정
#   으로 재개하면 완료 샷이 전부 다시 만들어진다(JIT_REGEN_LATCH.json 을
#   놓아 지출은 막아 뒀다) · 새 주행은 autodrive.sh 에
#   ACCEPT_PARTIAL 을 넘겨 쓴다.
#
# '마지막 임무' E2E 운전 루프 — autodrive 의 이 주행 전용판 (2026-08-15).
# 원본 autodrive 를 못 쓰는 이유: failed/partial 표적 회수가 최우선인데,
# 이 주행은 floor_plan_geometry_readback 이 **수용된 결함**(도면 2장에
# 마커 번호 중복 작화 — VLM 재시도로 안 풀림)으로 영구 partial 이라
# 켜자마자 상한 확인 후 멈춘다. 이 루프는 그 스텝을 잔여로 세지 않는다.
# 규칙: · 돌고 있으면 둔다 · 멈추면 run-all resume 으로만 재개(force 금지)
#       · 같은 스텝이 연속 3회 실패하면 소리치고 멈춘다(돈 새는 무한 재시도 차단)
set -u
P=fdc5f9f0-ee7b-4ac9-ac43-5d8d979664a3
E=950be69d-7139-4294-80fd-3f15949295c7
CAP=8000
ACCEPTED_PARTIAL="floor_plan_geometry_readback"
BASE=http://localhost:8000/api/v1/projects/$P/episodes/$E
DIR=$(cd "$(dirname "$0")" && pwd)

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

LAST_FAIL_STEP=""
LAST_FAIL_N=0
relogin
say "운전 시작 (수용 partial: $ACCEPTED_PARTIAL)"
while true; do
  ROWS=$(PGPASSWORD=theroad_dev_2026 psql -h localhost -U theroad -d theroad -tA -c \
    "select status||'|'||step_id from step_run where episode_id='$E' \
     and status in ('running','failed','partial');" 2>/dev/null)
  if [ -z "${ROWS// /}" ] && ! PGPASSWORD=theroad_dev_2026 psql -h localhost -U theroad -d theroad -tA -c "select 1;" >/dev/null 2>&1; then
    say "DB 조회 실패 — 60s 후 재시도"; /bin/sleep 60; continue
  fi
  RUNNING=$(printf '%s\n' "$ROWS" | grep -c '^running|' || true)
  if [ "$RUNNING" -gt 0 ]; then
    /bin/sleep 60; continue
  fi
  # 수용 partial 을 뺀 실패 목록
  BAD=$(printf '%s\n' "$ROWS" | grep -v '^running|' | grep -v "|$ACCEPTED_PARTIAL$" | grep -v '^$' || true)
  if [ -n "$BAD" ]; then
    STEP=$(printf '%s\n' "$BAD" | head -1 | cut -d'|' -f2)
    if [ "$STEP" = "$LAST_FAIL_STEP" ]; then
      LAST_FAIL_N=$((LAST_FAIL_N+1))
    else
      LAST_FAIL_STEP="$STEP"; LAST_FAIL_N=1
    fi
    if [ "$LAST_FAIL_N" -gt 3 ]; then
      say "★사람이 봐야 한다 — $STEP 연속 ${LAST_FAIL_N}회 실패. 멈춘다."
      exit 1
    fi
    say "$STEP 실패 감지 — run-all resume [$LAST_FAIL_N/3]"
  else
    say "정지 감지(실패 없음) — run-all resume"
  fi
  relogin
  HTTP=$(curl -s -o /dev/null -w '%{http_code}' -b /tmp/th_lm.cookie -X POST \
    "$BASE/steps/run-all?category=all&mode=resume&image_call_cap=$CAP&approve_image_generation=true")
  say "run-all HTTP $HTTP"
  if [ "$HTTP" != "200" ]; then
    say "재개 호출 실패($HTTP) — 120s 후 재시도"; /bin/sleep 120; continue
  fi
  /bin/sleep 90
done
