#!/bin/bash
# Watchdog-der-Watchdogs (KAR-956-Nachtrag, 12.08.2026 Watchdog-Incident-Fix).
#
# Root-Cause des 29-Tage-Ausfalls (14.07.-12.08.2026, siehe
# brain/post-mortem/2026-07-14-root-migration.md +
# brain/02-Wissen/watchdog-incident-2026-08-12.md): aria-watchdog.timer und
# aria-telegram-watchdog.timer wurden am 14.07. waehrend der Root-Migration
# bewusst gestoppt ("erst reaktivieren nach Umzug", KAR-956) und blieben es,
# OHNE dass irgendetwas das gemeldet hat. `enabled` sagt nur "startet beim
# naechsten Boot" — es beweist NICHT, dass ein Timer gerade laeuft, und dieser
# Server ist seit 06.05.2026 nicht neu gestartet worden, also griff das nie.
#
# Dieses Skript ist die unabhaengige dritte Instanz: es ueberwacht die
# Watchdogs selbst, mit einem eigenen, von ihnen UNABHAENGIGEN Timer. Faellt
# einer der beiden Watchdog-Timer aus, meldet dieses Skript es aktiv per
# Telegram statt zu schweigen. Es macht KEINE Restarts — nur Alarm, damit ein
# Mensch (oder eine kuenftige Aria-Session) bewusst entscheidet.
set -uo pipefail

LOG_FILE="/home/aria/logs/aria-watchdog-meta-check.log"
mkdir -p "$(dirname "$LOG_FILE")"
NOW="$(date '+%Y-%m-%d %H:%M:%S')"

TOKEN_FILE="/home/aria/.claude/channels/telegram/.env"
TOKEN=""
[ -f "$TOKEN_FILE" ] && TOKEN=$(grep -E "^TELEGRAM_BOT_TOKEN=" "$TOKEN_FILE" 2>/dev/null | cut -d'=' -f2- | tr -d '"' | head -1)

alert() {
    local msg="$1"
    echo "[$NOW] ALERT: $msg" >> "$LOG_FILE"
    if [ -n "$TOKEN" ]; then
        curl -s --max-time 10 -X POST "https://api.telegram.org/bot${TOKEN}/sendMessage" \
            -d chat_id="1164395546" -d text="🔴 Meta-Watchdog: $msg" > /dev/null 2>&1 || true
    fi
}

# Grace-State: nur bei WECHSEL alarmieren, nicht bei jedem Tick erneut spammen
# ([[change-only-watch-is-no-watch]] gilt fuer STILLE Stoerungen — hier ist das
# Gegenteil das Risiko: bei stabilem Ausfall soll trotzdem regelmaessig, aber
# gedaempft erinnert werden, nicht nur einmal beim Uebergang. Cooldown statt
# reinem Edge-Trigger.)
STATE_DIR="/tmp/aria-watchdog-meta-state"
mkdir -p "$STATE_DIR"
REMIND_COOLDOWN_SECONDS=21600  # 6h zwischen wiederholten Erinnerungen je Unit

check_unit_active() {
    local unit="$1"
    local label="$2"
    local state_file="$STATE_DIR/${unit}.last-bad"
    if systemctl is-active --quiet "$unit" 2>/dev/null; then
        echo "[$NOW] OK: $unit active" >> "$LOG_FILE"
        rm -f "$state_file"
        return 0
    fi
    local actual_state
    actual_state=$(systemctl is-active "$unit" 2>/dev/null || echo "unknown")
    local now_epoch last_epoch elapsed
    now_epoch=$(date +%s)
    if [ -f "$state_file" ]; then
        last_epoch=$(cat "$state_file" 2>/dev/null || echo 0)
        elapsed=$((now_epoch - last_epoch))
        if [ "$elapsed" -lt "$REMIND_COOLDOWN_SECONDS" ]; then
            echo "[$NOW] STILL-BAD (gedaempft, ${elapsed}s/${REMIND_COOLDOWN_SECONDS}s): $unit ist $actual_state" >> "$LOG_FILE"
            return 1
        fi
    fi
    echo "$now_epoch" > "$state_file"
    alert "${label} (${unit}) ist '${actual_state}', nicht 'active'. enabled schuetzt nicht vor 'systemctl stop' ohne Reboot — pruefen: systemctl status ${unit}"
    return 1
}

# Belt-and-suspenders: aria.service selbst mitueberwachen. Laeuft ueber dieselbe
# debounced check_unit_active-Funktion — wenn's down ist UND beide Watchdogs
# (die es sonst reparieren wuerden) es ebenfalls sind, kommen alle drei Alerts
# zusammen an und das Bild ist trotzdem klar: das ist das 14.07.-Szenario nochmal.
check_unit_active "aria-watchdog.timer" "Haupt-Watchdog-Timer"
check_unit_active "aria-telegram-watchdog.timer" "Telegram-Watchdog-Timer"
check_unit_active "aria.service" "Aria-Session selbst"

exit 0
