#!/usr/bin/env bash
# aria-login-watchdog.sh — KAR-1044 (09.09.2026)
# Deterministische Detection (KAR-684-Raster, kein LLM) fuer drei Ausfallmodi,
# die am 09.09.2026 Telegram stundenlang stumm gemacht haben:
#   1. LOGIN   — Claude in tmux "aria" haengt am OAuth-Login-Screen
#   2. CREDS   — OAuth-Credentials genullt/abgelaufen (expiresAt)
#   3. POLLER  — mehr als eine Telegram-Plugin-Instanz pollt getUpdates
#              (bot.pid-Singleton ist pro User-Home, greift nicht cross-user)
#   4. QUEUE   — gequeute Message haengt >2 Ticks unveraendert im Composer
# Edge-triggered: Alarm nur beim Neuauftreten einer Condition (State-File),
# Recovery setzt den State zurueck. Telegram-Ping direkt via Bot-API.
set -u

TMUX_SOCKET="/tmp/tmux-1001/default"
TMUX_SESSION="aria"
CREDS_FILE="/home/aria/.claude/.credentials.json"
TG_ENV="/home/aria/.claude/channels/telegram/.env"
STATE_FILE="/home/aria/state/login-watchdog.state"
LOG_FILE="/home/aria/logs/login-watchdog.log"
CHAT_ID="1164395546"

mkdir -p "$(dirname "$STATE_FILE")" "$(dirname "$LOG_FILE")"

log() { echo "[$(date -u '+%Y-%m-%d %H:%M:%S')Z] $*" >> "$LOG_FILE"; }

send_telegram() {
  local text="$1"
  local token
  token=$(grep -oE "[0-9]{8,10}:[A-Za-z0-9_-]{35}" "$TG_ENV" 2>/dev/null | head -1)
  if [ -z "$token" ]; then log "FEHLER: kein Bot-Token in $TG_ENV"; return 1; fi
  curl -s -m 10 -X POST "https://api.telegram.org/bot${token}/sendMessage" \
    -H "Content-Type: application/json" \
    -d "$(python3 -c "import json,sys; print(json.dumps({'chat_id': int('$CHAT_ID'), 'text': sys.argv[1]}))" "$text")" \
    > /dev/null || log "FEHLER: sendMessage fehlgeschlagen"
}

pane() { sudo -u aria tmux -S "$TMUX_SOCKET" capture-pane -t "$TMUX_SESSION" -p 2>/dev/null; }

PANE_CONTENT=$(pane)
ALERTS=""

# --- 1. LOGIN: haengt die Session am Login-Screen? ---
if echo "$PANE_CONTENT" | grep -qE "Login expired|Please run /login|Select login method|Paste code here if prompted"; then
  url=$(sudo -u aria tmux -S "$TMUX_SOCKET" capture-pane -t "$TMUX_SESSION" -p -J 2>/dev/null \
        | grep -oE "https://claude\.com/cai/oauth/authorize\?[^ ]+" | head -1)
  ALERTS="${ALERTS}LOGIN "
  MSG_LOGIN="⚠️ Aria ist AUSGELOGGT — Telegram-Antworten stehen still. Login-URL aus dem Pane:
${url:-<URL nicht extrahierbar — sudo -u aria tmux attach -t aria>}
Code danach an die Session (oder an die root-Claude-Session) geben."
fi

# --- 2. CREDS: expiresAt genullt oder abgelaufen? ---
CREDS_STATE=$(python3 - "$CREDS_FILE" <<'PY'
import json, sys, time
try:
    d = json.load(open(sys.argv[1]))
    e = (d.get("claudeAiOauth") or {}).get("expiresAt", 0)
except Exception:
    print("UNREADABLE"); sys.exit()
now_ms = time.time() * 1000
print("EXPIRED" if e < now_ms else "OK")
PY
)
if [ "$CREDS_STATE" != "OK" ]; then
  ALERTS="${ALERTS}CREDS "
fi

# --- 3. POLLER: mehr als eine server.ts-Instanz? ---
POLLERS=$(pgrep -fc "bun server\.ts" || true)
if [ "${POLLERS:-0}" -gt 1 ]; then
  ALERTS="${ALERTS}POLLER "
  MSG_POLLER="⚠️ ${POLLERS} Telegram-Poller-Instanzen aktiv — Nachrichten gehen verloren (409-Flapping). Erwartete: 1 (aria-Session). Pruefen: pgrep -af 'bun server.ts'"
fi

# --- 4. QUEUE: gequeute Message haengt (gleicher Composer-Inhalt wie letzter Tick)? ---
# Auto-Fix (09.09.2026 Empirie): Enter allein submitted eine haengende Queue-
# Message NICHT — den Text literal neu tippen + Enter tut es. Alarm nur, wenn
# derselbe Text auch nach einem Auto-Fix-Versuch noch haengt.
COMPOSER=$(echo "$PANE_CONTENT" | grep -E "^❯ .+" | head -1)
LAST_COMPOSER=$(grep "^composer=" "$STATE_FILE" 2>/dev/null | cut -d= -f2-)
LAST_FIXED=$(grep "^fixed=" "$STATE_FILE" 2>/dev/null | cut -d= -f2-)
if [ -n "$COMPOSER" ] && [ "$COMPOSER" = "$LAST_COMPOSER" ]; then
  if [ "$COMPOSER" != "$LAST_FIXED" ]; then
    QUEUED_TEXT="${COMPOSER#❯ }"
    sudo -u aria tmux -S "$TMUX_SOCKET" send-keys -t "$TMUX_SESSION" C-u 2>/dev/null
    sudo -u aria tmux -S "$TMUX_SOCKET" send-keys -t "$TMUX_SESSION" -l "$QUEUED_TEXT" 2>/dev/null
    sleep 1
    sudo -u aria tmux -S "$TMUX_SOCKET" send-keys -t "$TMUX_SESSION" Enter 2>/dev/null
    log "QUEUE-AUTOFIX: '$QUEUED_TEXT' neu submitted"
    FIXED_NOW="$COMPOSER"
  else
    ALERTS="${ALERTS}QUEUE "
    MSG_QUEUE="⚠️ Nachricht haengt trotz Auto-Fix unverarbeitet in der Aria-Session: ${COMPOSER#❯ }
Manuell: sudo -u aria tmux attach -t aria"
  fi
fi

# --- Edge-Trigger: nur neue Conditions alarmieren ---
LAST_ALERTS=$(grep "^alerts=" "$STATE_FILE" 2>/dev/null | cut -d= -f2-)
{
  echo "alerts=${ALERTS}"
  echo "composer=${COMPOSER}"
  echo "fixed=${FIXED_NOW:-$LAST_FIXED}"
} > "$STATE_FILE"

if [ -z "$ALERTS" ]; then
  [ -n "$LAST_ALERTS" ] && log "RECOVERY: ${LAST_ALERTS}→ ok"
  log "OK (poller=${POLLERS:-0}, creds=${CREDS_STATE})"
  exit 0
fi

log "ALERT: ${ALERTS}(vorher: ${LAST_ALERTS:-keine})"
for cond in $ALERTS; do
  case " $LAST_ALERTS " in *" $cond "*) continue;; esac  # schon gemeldet
  case $cond in
    LOGIN)  send_telegram "$MSG_LOGIN" ;;
    CREDS)  send_telegram "⚠️ Aria OAuth-Credentials abgelaufen/genullt (expiresAt) — Login-Screen folgt vermutlich gleich. Check: $CREDS_FILE" ;;
    POLLER) send_telegram "$MSG_POLLER" ;;
    QUEUE)  send_telegram "$MSG_QUEUE" ;;
  esac
  log "PING gesendet: $cond"
done
exit 0
