#!/bin/bash
# Guardian: mantiene vivo el OCR de Surya para Sri Caitanya Caritamrta.
# Relanza surya_full.py si el proceso muere; sale cuando CC está 100% OCR.
# Es idempotente: no lanza un segundo proceso si ya hay uno vivo.
#   nohup bash cc_guardian.sh >/dev/null 2>&1 &
set -u
cd /Users/jaganat/git_projects/astro_vedabase/scripts/scan_audit || exit 1

BOOK=sri-caitanya-caritamrta
PY=surya-venv/bin/python
LOG=surya/cc_run.log
GLOG=surya/cc_guardian.log
INTERVAL=60            # cada cuánto se comprueba el estado
STALL=900             # si no entra NINGUNA página nueva en 900s (15 min) el
                      # llama-server está colgado (timeouts) → matar y relanzar.
WORKERS=4             # páginas en paralelo. Con la GPU saturada, 4 da casi el
                      # mismo ritmo que 8 y estresa mucho menos al servidor
                      # (8 lo dejó colgado ~100 min sin que el pgrep lo notara).
export SURYA_PAGE_WORKERS="$WORKERS"

# Total de páginas esperadas (suma de Pages: de los 17 PDFs de CC)
TOTAL=$(python3 - <<'EOF'
import json, subprocess
c = json.load(open('books.json')); root = c['_scan_root']
t = 0
for rel in c['books']['sri-caitanya-caritamrta']:
    try:
        out = subprocess.check_output(['pdfinfo', f'{root}/{rel}'], text=True,
                                      stderr=subprocess.DEVNULL)
        for l in out.splitlines():
            if l.startswith('Pages:'):
                t += int(l.split()[-1])
    except Exception:
        pass
print(t)
EOF
)

echo "[guardian] $(date '+%F %T') inicio — total CC = ${TOTAL} pgs" >> "$GLOG"

if [ -z "$TOTAL" ] || [ "$TOTAL" -eq 0 ]; then
    echo "[guardian] $(date '+%F %T') no pude contar páginas; abortando" >> "$GLOG"
    exit 1
fi

last_done=-1
last_change=$(date +%s)

while true; do
    done=$(find "surya/$BOOK" -name '*.surya.txt' 2>/dev/null | wc -l | tr -d ' ')
    now=$(date +%s)

    if [ "$done" -ge "$TOTAL" ]; then
        echo "[guardian] $(date '+%F %T') CC COMPLETO (${done}/${TOTAL}). Fin." >> "$GLOG"
        break
    fi

    # ── Watchdog de progreso: "vivo" no basta, tiene que AVANZAR ──────────────
    if [ "$done" -ne "$last_done" ]; then
        last_done="$done"
        last_change="$now"
    fi
    stalled=$(( now - last_change ))
    if [ "$stalled" -ge "$STALL" ] && pgrep -f "surya_full.py --book ${BOOK}" >/dev/null 2>&1; then
        echo "[guardian] $(date '+%F %T') ATASCADO ${stalled}s sin avanzar (${done}/${TOTAL}) — matando worker+servidor" >> "$GLOG"
        pkill -f "surya_full.py --book ${BOOK}"
        pkill -f "llama-server"
        last_change="$now"      # dar margen antes de re-declarar atasco
        sleep 5
    fi

    # ── Relanzar si el worker no está vivo ───────────────────────────────────
    if ! pgrep -f "surya_full.py --book ${BOOK}" >/dev/null 2>&1; then
        echo "[guardian] $(date '+%F %T') OCR no corre (${done}/${TOTAL}) — relanzando (workers=${WORKERS})" >> "$GLOG"
        nohup "$PY" surya_full.py --book "$BOOK" >> "$LOG" 2>&1 &
        last_change=$(date +%s)  # el arranque + carga de modelo no cuenta como atasco
        sleep 15
    fi

    sleep "$INTERVAL"
done
