#!/bin/bash
# patch-reindex-status.sh — adiciona aviso automático de fim de reindexação
# Aplica no servidor: 1) endpoint /reindex-status no gateway  2) sondagem no admin.php
set -e

GW=/var/www/html/assistant/gateway.py
ADMIN=/var/www/html/moodle/local/chatbot/admin.php
PROXY=/var/www/html/moodle/local/chatbot/proxy.php

cp "$GW" "$GW.bak.$(date +%s)"
cp "$ADMIN" "$ADMIN.bak.$(date +%s)"
cp "$PROXY" "$PROXY.bak.$(date +%s)"

# ---------- 1. endpoint /reindex-status no gateway ----------
if ! grep -q "reindex-status" "$GW"; then
python3 - "$GW" << 'PYEOF'
import sys
p = sys.argv[1]
src = open(p).read()
endpoint = '''

@app.get("/reindex-status/{courseid}")
def reindex_status(
    courseid: int,
    x_assistant_secret: Optional[str] = Header(default=None),
):
    """Lê o log de reindexação e diz se terminou (para o painel avisar sozinho)."""
    verify_internal_secret(x_assistant_secret)
    log_path = BASE_DIR / f"reindex_{courseid}.log"
    if not log_path.exists():
        return {"state": "none"}
    try:
        tail = log_path.read_text(errors="ignore").splitlines()[-15:]
    except Exception:
        return {"state": "unknown"}
    text = "\\n".join(tail)
    if "Total de chunks" in text or "Índice criado" in text:
        # extrair o nº de chunks, se possível
        chunks = None
        for line in reversed(tail):
            if "Total de chunks" in line:
                import re
                m = re.search(r"(\\d+)", line)
                if m: chunks = int(m.group(1))
                break
        return {"state": "done", "chunks": chunks}
    if "Traceback" in text or "[erro]" in text or "Error" in text:
        return {"state": "error", "tail": tail[-5:]}
    return {"state": "running"}

'''
marker = '@app.post("/lesson/generate")'
src = src.replace(marker, endpoint + "\n\n" + marker, 1)
open(p,"w").write(src)
import ast; ast.parse(src)
print("[ok] endpoint /reindex-status adicionado")
PYEOF
else
  echo "[skip] endpoint /reindex-status já existe"
fi

# ---------- 2. acção 'reindex_status' no proxy ----------
if ! grep -q "reindex_status" "$PROXY"; then
python3 - "$PROXY" << 'PYEOF'
import sys
p = sys.argv[1]
src = open(p).read()
case = '''
    case 'reindex_status': {
        lcb_require_admin();
        $courseid = (int)($_GET['courseid'] ?? 0);
        if ($courseid <= 0) { lcb_out(400, ['detail' => 'courseid obrigatório.']); }
        lcb_gateway_call('GET', "/reindex-status/{$courseid}");
        break;
    }

'''
marker = "    default:"
src = src.replace(marker, case + marker, 1)
open(p,"w").write(src)
print("[ok] acção reindex_status adicionada ao proxy")
PYEOF
else
  echo "[skip] acção reindex_status já existe no proxy"
fi

# ---------- 3. sondagem automática no admin.php ----------
if ! grep -q "pollReindex" "$ADMIN"; then
python3 - "$ADMIN" << 'PYEOF'
import sys
p = sys.argv[1]
src = open(p).read()

# substituir a função reindex() para iniciar a sondagem após disparar
old = '''  const d = await r.json();
  setStatus(r.ok ? ('✓ ' + (d.note || 'Reindexação a decorrer. Recarrega os recursos daqui a uns minutos.'))
                 : ('Erro: ' + (d.detail || r.status)));
}'''
new = '''  const d = await r.json();
  if (r.ok){
    setStatus('⏳ Reindexação a decorrer… (acompanho e aviso quando terminar)');
    pollReindex();
  } else {
    setStatus('Erro: ' + (d.detail || r.status));
  }
}

let pollTimer = null;
function pollReindex(){
  if (pollTimer) clearInterval(pollTimer);
  let tries = 0;
  pollTimer = setInterval(async () => {
    tries++;
    if (tries > 120){ clearInterval(pollTimer); return; }  // desiste após ~10 min
    try{
      const r = await fetch(PROXY + '?action=reindex_status&courseid=' + COURSEID);
      const d = await r.json();
      if (d.state === 'done'){
        clearInterval(pollTimer);
        setStatus('✓ Reindexação concluída! ' + (d.chunks ? '(' + d.chunks + ' chunks) ' : '') + 'A actualizar…');
        loadCourses();
        loadResources();
      } else if (d.state === 'error'){
        clearInterval(pollTimer);
        setStatus('⚠ A reindexação terminou com erro. Verifica o log reindex_' + COURSEID + '.log no servidor.');
      } else {
        setStatus('⏳ Reindexação a decorrer… (' + (tries*5) + 's)');
      }
    }catch(e){ /* continua a tentar */ }
  }, 5000);
}'''
assert old in src, "padrão da função reindex() não encontrado"
src = src.replace(old, new, 1)
open(p,"w").write(src)
print("[ok] sondagem automática adicionada ao admin.php")
PYEOF
else
  echo "[skip] sondagem já existe no admin.php"
fi

# ---------- validar e reiniciar ----------
python3 -c "import ast; ast.parse(open('$GW').read()); print('[ok] sintaxe gateway OK')"
php -l "$PROXY" >/dev/null && echo "[ok] sintaxe proxy OK"

chown www-data:www-data "$ADMIN" "$PROXY"
systemctl restart assistant
sudo -u www-data php /var/www/html/moodle/admin/cli/purge_caches.php
echo
echo "Concluído. Testa: painel -> Reindexar curso -> a mensagem deve passar sozinha a '✓ concluída'."
