#!/bin/bash
# KAR-516 Schritt 3 — Proaktiv-Stille-Detector
# Pingt Kais NUR wenn ein echter Haenger vorliegt: Kais hat eine Nachricht
# geschickt (direction=in) und Aria hat seit > THRESHOLD nichts zurueck-
# geschickt (kein direction=out neuer als die Inbound). Reines Idle (Kais
# fragt nichts) wird NICHT mehr gepingt — das war die "viel zu oft"-Ursache
# (KAR-684 Anti-Polling: nur echtes Signal pingen, nicht feste Kadenz).
# Trigger: aria-silence-detector.timer (alle 15 min). 07-22 Europe/Berlin.

set -euo pipefail

LOG="/var/log/aria-silence-detector.log"
COOLDOWN_FILE="/tmp/aria-silence-detector-cooldown"
IDLE_MARKER="/tmp/aria-idle-by-design"
THRESHOLD_SECONDS=3600           # 60 min unbeantwortete Inbound = Haenger-Verdacht
NOTIFY_COOLDOWN_SECONDS=10800    # Max 1 Ping pro 3 h (auch bei echtem Haenger kein 75-min-Spam)

log() { echo "$(date '+%Y-%m-%d %H:%M:%S') $1" >> "$LOG"; }

# ENV laden (Supabase + Telegram)
set -a
source /root/aria/.env 2>/dev/null || true
source /root/aria/scripts/.env.aria 2>/dev/null || true
source /root/.claude/channels/telegram/.env 2>/dev/null || true
set +a

# Working-Hours-Gate: nur 07-22 Europe/Berlin
HOUR=$(TZ=Europe/Berlin date +%H)
HOUR=${HOUR#0}  # 07 → 7
if [ "$HOUR" -lt 7 ] || [ "$HOUR" -ge 22 ]; then
    log "outside_working_hours (Berlin=${HOUR}h) — skip"
    exit 0
fi

# Idle-by-design Marker respektieren (z.B. wenn Kais explizit lange Tasks anstoesst)
if [ -f "$IDLE_MARKER" ]; then
    log "idle_by_design marker present — skip"
    exit 0
fi

# Notify-Cooldown gegen Ping-Spam (max 1 Ping/Stunde)
if [ -f "$COOLDOWN_FILE" ]; then
    LAST=$(cat "$COOLDOWN_FILE" 2>/dev/null || echo 0)
    NOW=$(date +%s)
    ELAPSED=$((NOW - LAST))
    if [ "$ELAPSED" -lt "$NOTIFY_COOLDOWN_SECONDS" ]; then
        log "notify_cooldown_active (${ELAPSED}s < ${NOTIFY_COOLDOWN_SECONDS}s) — skip"
        exit 0
    fi
fi

# Letzten Inbound + Outbound aus Supabase aria_chat_log holen
if [ -z "${ARIA_SUPABASE_URL:-}" ] || [ -z "${ARIA_SUPABASE_SERVICE_KEY:-}" ]; then
    log "ERROR: ARIA_SUPABASE_URL/KEY nicht gesetzt — abort"
    exit 1
fi

fetch_last() {  # $1 = direction (in|out) → ISO-Timestamp oder leer
    curl -sS --max-time 10 \
        "${ARIA_SUPABASE_URL}/rest/v1/aria_chat_log?select=created_at&direction=eq.$1&chat_id=eq.${TELEGRAM_CHAT_ID}&order=created_at.desc&limit=1" \
        -H "apikey: ${ARIA_SUPABASE_SERVICE_KEY}" \
        -H "Authorization: Bearer ${ARIA_SUPABASE_SERVICE_KEY}" 2>/dev/null \
        | python3 -c "import sys,json; d=json.load(sys.stdin); print(d[0]['created_at'] if d else '')" 2>/dev/null || echo ""
}

LAST_IN_ISO=$(fetch_last in)
LAST_OUT_ISO=$(fetch_last out)

# Kein Inbound = Kais hat (noch) nichts gefragt → kein Haenger moeglich.
if [ -z "$LAST_IN_ISO" ]; then
    log "no_inbound_history — kein Ping (nichts zu beantworten)"
    exit 0
fi

LAST_IN_EPOCH=$(date -d "$LAST_IN_ISO" +%s 2>/dev/null || echo 0)
LAST_OUT_EPOCH=$(date -d "${LAST_OUT_ISO:-1970-01-01}" +%s 2>/dev/null || echo 0)
NOW_EPOCH=$(date +%s)

# Aria hat NACH der letzten Inbound geantwortet → kein Haenger, normales Idle.
if [ "$LAST_OUT_EPOCH" -ge "$LAST_IN_EPOCH" ]; then
    log "responded (last_out >= last_in) — OK, normales Idle"
    exit 0
fi

# Unbeantwortete Inbound: wie lange wartet Kais schon?
WAIT=$((NOW_EPOCH - LAST_IN_EPOCH))
if [ "$WAIT" -lt "$THRESHOLD_SECONDS" ]; then
    log "unanswered_inbound aber erst ${WAIT}s < ${THRESHOLD_SECONDS}s — noch OK"
    exit 0
fi

# Echter Haenger-Verdacht: Kais hat geschrieben, Aria seit > Threshold stumm.
MINUTES=$((WAIT / 60))
log "HANG_SUSPECT: unbeantwortete Inbound seit ${MINUTES} min — sende Ping"

if [ -z "${TELEGRAM_BOT_TOKEN:-}" ] || [ -z "${TELEGRAM_CHAT_ID:-}" ]; then
    log "ERROR: TELEGRAM_BOT_TOKEN/CHAT_ID nicht gesetzt — abort"
    exit 1
fi

MSG=$(printf '💤 <b>Haenge ich?</b>\nDeine letzte Nachricht ist <b>%d min</b> unbeantwortet.\nWenn ich an einem laengeren Task sitze: <code>touch /tmp/aria-idle-by-design</code>\nSonst haengt vermutlich was — pruefe <code>tail /var/log/aria-watchdog.log</code>' "$MINUTES")

curl -sS --max-time 10 -X POST \
    "https://api.telegram.org/bot${TELEGRAM_BOT_TOKEN}/sendMessage" \
    -d chat_id="$TELEGRAM_CHAT_ID" \
    -d parse_mode="HTML" \
    -d text="$MSG" > /dev/null 2>&1 || log "ERROR: Telegram-Send fehlgeschlagen"

date +%s > "$COOLDOWN_FILE"
log "ping_sent (unanswered=${MINUTES}min)"
exit 0
