#!/usr/bin/env bash
# Agente Pessoal Kit: módulo RELIGADOR (vigia do agente, de fábrica).
#
# Para que serve: quando o agente "some" (gateway parado ou travado), o dono fica
# sem resposta no Telegram e, se não for técnico, não tem como religar sozinho.
# Este módulo instala um vigia que religa o agente AUTOMATICAMENTE:
#   - um timer systemd roda a checagem a cada 5 minutos;
#   - serviço parado → religa; serviço "ativo" porém mudo ao `openclaw health` → religa;
#   - toda ação fica registrada em /var/log/agente-religador.log.
#
# O systemd (Restart=always) já cobre o processo que MORRE; o religador cobre o que o
# Restart não vê: serviço parado por engano e gateway vivo porém travado (hung).
# Enquanto o `.env` não tem o token do Telegram (instalação em curso), o vigia dorme;
# assim o timer pode nascer ligado sem atrapalhar os passos seguintes da instalação.
#
# Uso: bash setup-religador.sh   (o setup.sh chama sozinho; rodar como root na VPS)
# Teste sem mexer no systemd:  RELIGADOR_DRY_RUN=1 CHECK_BIN=/tmp/x LOG=/tmp/x.log \
#                              UNIT_DIR=/tmp bash setup-religador.sh

set -euo pipefail

SERVICE="openclaw-gateway.service"
CHECK_BIN="${CHECK_BIN:-/usr/local/bin/agente-religador}"
LOG="${LOG:-/var/log/agente-religador.log}"
UNIT_DIR="${UNIT_DIR:-/etc/systemd/system}"
OPENCLAW_BIN="${OPENCLAW_BIN:-/usr/local/bin/openclaw}"
ENV_FILE="$HOME/.openclaw/.env"
DRY_RUN="${RELIGADOR_DRY_RUN:-0}"

echo "==> [religador] Escrevendo o vigia ($CHECK_BIN)"
cat > "$CHECK_BIN" <<CHECK
#!/usr/bin/env bash
# Religador: religa o gateway do agente quando ele cai ou trava.
# Gerado por setup-religador.sh; roda via agente-religador.timer (5 em 5 min).
set -u
SERVICE="$SERVICE"
LOG="$LOG"
log() { echo "\$(date '+%Y-%m-%d %H:%M:%S') \$*" >> "\$LOG"; }

# Instalação ainda em curso (sem token do Telegram no .env)? Dorme.
grep -q '^TELEGRAM_BOT_TOKEN=.\+' "$ENV_FILE" 2>/dev/null || exit 0

# Rotação simples: log acima de 1 MB encolhe pras últimas 200 linhas.
if [ -f "\$LOG" ] && [ "\$(wc -c < "\$LOG")" -gt 1048576 ]; then
  tail -n 200 "\$LOG" > "\$LOG.tmp" && mv "\$LOG.tmp" "\$LOG"
fi

state="\$(systemctl is-active "\$SERVICE" 2>/dev/null || true)"
case "\$state" in
  activating|reloading|deactivating)
    exit 0 ;;
  active)
    # Serviço "ativo": o gateway responde? Travado = religa.
    if ! timeout 75 "$OPENCLAW_BIN" health >/dev/null 2>&1; then
      log "gateway ativo porém sem resposta ao health: religando"
      systemctl restart "\$SERVICE"
    fi
    ;;
  *)
    log "gateway \$state: religando"
    systemctl restart "\$SERVICE"
    ;;
esac
exit 0
CHECK
chmod 755 "$CHECK_BIN"
bash -n "$CHECK_BIN"

echo "==> [religador] Unidades systemd (service oneshot + timer 5/5 min)"
cat > "$UNIT_DIR/agente-religador.service" <<UNIT
[Unit]
Description=Religador do agente (religa o gateway se cair ou travar)

[Service]
Type=oneshot
Environment=HOME=$HOME
ExecStart=$CHECK_BIN
UNIT

cat > "$UNIT_DIR/agente-religador.timer" <<UNIT
[Unit]
Description=Religador do agente - checagem a cada 5 minutos

[Timer]
OnBootSec=3min
OnUnitActiveSec=5min
AccuracySec=30s

[Install]
WantedBy=timers.target
UNIT

if [ "$DRY_RUN" = "1" ]; then
  echo "==> [religador] DRY RUN: arquivos gerados, systemd intocado."
  exit 0
fi

systemctl daemon-reload
systemctl enable --now agente-religador.timer

echo "==> [religador] OK: timer $(systemctl is-active agente-religador.timer)"
echo "    Checagem: 5/5 min | Log: $LOG"
echo "    O vigia só age depois que o .env tiver o token do Telegram (fim da instalação)."
