#!/usr/bin/env bash
# Guardián genérico de Surya: re-OCR-ea las páginas VACÍAS de uno o varios
# libros y supervisa el proceso. Sustituye a cc_guardian.sh / bg_guardian.sh,
# que eran copias del mismo código con el libro incrustado.
#
#   caffeinate -i nohup bash surya_guardian.sh nectar-of-devotion raja-vidya >/dev/null 2>&1 &
#   bash surya_guardian.sh --all-broken     # los 7 libros con OCR fallido
#
# POR QUÉ (2026-07-29): los guardianes anteriores decidían "COMPLETO" con
#   find surya/<libro> -name '*.surya.txt' | wc -l
# o sea contando FICHEROS. Y surya_full.py escribe el fichero igual cuando la
# página falla (outf.write_text(""), líneas 139 y 148), así que una página
# fallida contaba como hecha y en la pasada siguiente se saltaba por el
# `if outf.exists()`. Resultado: el Caitanya-caritāmṛta se dio por terminado el
# 17-jul con 103 páginas vacías, y SIETE libros pequeños quedaron con entre el
# 17% y el 85% de sus páginas sin texto — OCR-eados en el modo full-page viejo,
# el que se colgaba. Nadie lo vio porque el contador decía 100%.
#
# LA REGLA: una página vacía puede ser legítima (lámina en color, hoja en
# blanco) o un fallo. La única forma de distinguirlas es BORRARLA y volver a
# OCR-earla en modo bloque: si vuelve vacía, es legítima. Por eso este script
# borra los 0 bytes antes de empezar y al final informa de cuántos quedan.
set -uo pipefail
cd "$(dirname "$0")" || exit 1

PY=surya-venv/bin/python
INTERVAL=60
STALL=900            # sin avanzar 15 min => llama-server colgado, matar y relanzar
export SURYA_PAGE_WORKERS="${SURYA_PAGE_WORKERS:-4}"

ROTOS=(nectar-of-devotion nectar-of-instruction light-of-the-bhagavata
       path-of-perfection perfection-of-yoga on-the-way-to-krsna raja-vidya)

if [ "${1:-}" = "--all-broken" ]; then
    BOOKS=("${ROTOS[@]}")
elif [ $# -ge 1 ]; then
    BOOKS=("$@")
else
    echo "uso: $0 <libro> [libro...]   |   $0 --all-broken"; exit 1
fi

GLOG=surya/guardian.log
say() { echo "[guardian] $(date '+%F %T') $*" | tee -a "$GLOG"; }

pages_of() {   # total de páginas del libro según los PDFs de books.json
    python3 - "$1" <<'EOF'
import json, subprocess, sys
from pathlib import Path
cfg = json.loads(Path('books.json').read_text())
root = Path(cfg['_scan_root']); t = 0
for rel in cfg['books'].get(sys.argv[1], []):
    try:
        out = subprocess.check_output(['pdfinfo', str(root/rel)], text=True, stderr=subprocess.DEVNULL)
        t += int([l for l in out.splitlines() if l.startswith('Pages:')][0].split()[-1])
    except Exception:
        pass
print(t)
EOF
}

for BOOK in "${BOOKS[@]}"; do
    TOTAL=$(pages_of "$BOOK")
    if [ -z "$TOTAL" ] || [ "$TOTAL" -eq 0 ]; then
        say "$BOOK: no pude contar páginas, lo salto"; continue
    fi

    VAC=$(find "surya/$BOOK" -name '*.surya.txt' -size 0 2>/dev/null | wc -l | tr -d ' ')
    say "$BOOK: $TOTAL págs, $VAC vacías -> las borro para re-OCR en modo bloque"
    find "surya/$BOOK" -name '*.surya.txt' -size 0 -delete 2>/dev/null

    last=-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)
        [ "$done" -ge "$TOTAL" ] && break

        if [ "$done" -ne "$last" ]; then last="$done"; last_change="$now"; fi
        if [ $((now - last_change)) -ge "$STALL" ] && pgrep -f "surya_full.py --book ${BOOK}" >/dev/null; then
            say "$BOOK: ATASCADO $((now-last_change))s en $done/$TOTAL — mato worker y servidor"
            pkill -f "surya_full.py --book ${BOOK}"; pkill -f llama-server
            last_change="$now"; sleep 5
        fi
        if ! pgrep -f "surya_full.py --book ${BOOK}" >/dev/null; then
            say "$BOOK: relanzando en $done/$TOTAL (workers=$SURYA_PAGE_WORKERS)"
            nohup "$PY" surya_full.py --book "$BOOK" >> "surya/${BOOK}_run.log" 2>&1 &
            last_change=$(date +%s); sleep 15
        fi
        sleep "$INTERVAL"
    done

    # --- Verificación REAL: ficheros CON TEXTO, no ficheros ---
    CON=$(find "surya/$BOOK" -name '*.surya.txt' ! -size 0 | wc -l | tr -d ' ')
    VAC2=$(find "surya/$BOOK" -name '*.surya.txt' -size 0 | wc -l | tr -d ' ')
    PCT=$(( 100 * VAC2 / TOTAL ))
    say "$BOOK: $TOTAL págs | con texto $CON | vacías $VAC2 (${PCT}%)"
    if [ "$PCT" -gt 15 ]; then
        say "$BOOK: AVISO — ${PCT}% vacías tras re-OCR. Por encima del ~6% que"
        say "$BOOK: explican láminas y hojas en blanco. Revisar a mano antes de auditar."
    fi
done

say "fin. Recordatorio: 'completo' = páginas CON TEXTO, no ficheros creados."
