#!/bin/bash
# Aria neustarten - ZENTRALE Restart-Logik
# Aufgerufen von: n8n, Control Panel, Watchdog, aria-full-restart.sh, manuell
#
# Usage: aria-restart.sh [--force] [--reason "text"]
#   --force: Watchdog stoppen, SIGKILL aggressiver (= bisheriges full-restart)
#   Ohne --force: Normaler Restart
#
# Kontext-Restore: Der Wrapper (aria-wrapper.sh) handhabt --resume automatisch.
# Dieses Script muss nur sauber stoppen und neu starten.

SESSION="aria"
LOG="/var/log/aria-watchdog.log"
COOLDOWN_FILE="/tmp/aria-restart-cooldown"

# Args parsen
FORCE=0
RESTART_REASON="Manuell"
while [ $# -gt 0 ]; do
    case "$1" in
        --force) FORCE=1; shift ;;
        --reason) RESTART_REASON="$2"; shift 2 ;;
        *) RESTART_REASON="$1"; shift ;;
    esac
done

# Token und Chat-ID zentral aus .env
source $HOME/aria/.env 2>/dev/null
BOT_TOKEN="${TELEGRAM_BOT_TOKEN}"
CHAT_ID="${TELEGRAM_CHAT_ID:-${TELEGRAM_CHAT_ID}}"
export PATH="/root/.local/bin:/usr/local/bin:/usr/bin:/bin:$PATH"

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

NOTIFY_COOLDOWN_FILE="/tmp/aria-notify-cooldown"
NOTIFY_COOLDOWN_SECONDS=600  # Max 1 Telegram-Nachricht pro 10 Minuten

telegram_notify() {
    if [ -n "$BOT_TOKEN" ]; then
        # Rate Limit: nicht öfter als alle 10 Min eine Nachricht
        if [ -f "$NOTIFY_COOLDOWN_FILE" ]; then
            LAST_NOTIFY=$(cat "$NOTIFY_COOLDOWN_FILE" 2>/dev/null)
            NOW=$(date +%s)
            ELAPSED=$((NOW - LAST_NOTIFY))
            if [ "$ELAPSED" -lt "$NOTIFY_COOLDOWN_SECONDS" ]; then
                return
            fi
        fi
        date +%s > "$NOTIFY_COOLDOWN_FILE"
        curl -s -X POST "https://api.telegram.org/bot${BOT_TOKEN}/sendMessage" \
            -d chat_id="$CHAT_ID" \
            -d parse_mode="HTML" \
            -d text="$1" > /dev/null 2>&1
    fi
}

echo "$(date '+%H:%M:%S') Restart angefordert (Grund: $RESTART_REASON, Force: $FORCE)..."
log "Restart angefordert (Grund: $RESTART_REASON, Force: $FORCE)"

# Restart Sentinel schreiben (OpenClaw-Pattern)
# Nach dem Restart liest Aria die Datei und meldet sich beim User
SENTINEL_FILE="/root/.aria-restart-sentinel.json"
cat > "$SENTINEL_FILE" << SENTINEL_EOF
{
  "reason": "$RESTART_REASON",
  "timestamp": "$(date -Iseconds)",
  "force": $FORCE
}
SENTINEL_EOF

# Cooldown loeschen (manueller/expliziter Restart ueberschreibt Cooldown)
rm -f "$COOLDOWN_FILE"

# Bei --force: Watchdog stoppen damit er nicht dazwischenfunkt
if [ "$FORCE" = "1" ]; then
    systemctl stop aria-watchdog.timer 2>/dev/null
    echo "$(date '+%H:%M:%S') Watchdog gestoppt"
fi

# 1. Session-ID sichern bevor wir killen (fuer Resume)
if tmux has-session -t "$SESSION" 2>/dev/null; then
    tmux capture-pane -t "$SESSION" -p > /root/.aria-last-session.txt 2>/dev/null
    tmux kill-session -t "$SESSION"
    echo "$(date '+%H:%M:%S') Alte tmux-Session beendet"
fi

# 2. Prozesse stoppen
# OpenClaw-Pattern: Graceful Drain - SIGTERM zuerst, 10s warten, dann SIGKILL
# Gibt Aria Zeit laufende Tools (Commits, API-Calls) zu beenden
if [ "$FORCE" != "1" ]; then
    log "Graceful Drain: SIGTERM an Claude (10s warten)..."
    pkill -TERM -x claude 2>/dev/null
    for i in $(seq 1 10); do
        sleep 1
        if ! pgrep -x claude > /dev/null 2>&1; then
            log "Claude sauber beendet nach ${i}s"
            break
        fi
    done
fi

pkill -x claude 2>/dev/null
sleep 2
pkill -f "bun.*telegram.*server" 2>/dev/null
pkill -f "bun.*server\.ts" 2>/dev/null
pkill -f "channels.*telegram" 2>/dev/null
sleep 2

# SIGKILL falls noetig (bei --force immer, sonst nur wenn haengt)
if pgrep -x claude > /dev/null 2>&1; then
    echo "$(date '+%H:%M:%S') WARNUNG: Claude haengt, SIGKILL..."
    pkill -9 -x claude 2>/dev/null
    sleep 1
fi
if pgrep -f "bun.*server\.ts" > /dev/null 2>&1; then
    pkill -9 -f "bun.*server\.ts" 2>/dev/null
    sleep 1
fi

if [ "$FORCE" = "1" ] && pgrep -x claude > /dev/null 2>&1; then
    echo "FEHLER: Claude laesst sich nicht killen!"
    systemctl start aria-watchdog.timer 2>/dev/null
    telegram_notify "$(printf '❌ <b>Aria Restart fehlgeschlagen</b>\nClaude nicht killbar.')"
    exit 1
fi

# 3. Grace Period setzen - Watchdog soll Telegram nicht sofort checken
date +%s > /tmp/aria-restart-grace

# 4. Neue Session starten (Wrapper handhabt --resume)
# Stale Socket entfernen falls tmux-Server nicht mehr laeuft
if ! tmux ls >/dev/null 2>&1; then
    TMUX_SOCKET="/tmp/tmux-$(id -u)/default"
    if [ -S "$TMUX_SOCKET" ]; then
        rm -f "$TMUX_SOCKET"
        echo "$(date '+%H:%M:%S') Stale tmux-Socket entfernt"
    fi
fi
tmux new-session -d -s "$SESSION" -c /root "bash $HOME/aria/scripts/aria-wrapper.sh"
echo "$(date '+%H:%M:%S') tmux gestartet, warte auf Claude..."

# 5. Trust-Dialog abwarten
TRUST_OK=0
for i in $(seq 1 40); do
    sleep 1
    if ! tmux has-session -t "$SESSION" 2>/dev/null; then
        echo "$(date '+%H:%M:%S') FEHLER: tmux-Session gestorben"
        tail -5 /var/log/aria-stderr.log 2>/dev/null
        break
    fi
    SCREEN=$(tmux capture-pane -t "$SESSION" -p 2>/dev/null)
    if echo "$SCREEN" | grep -qi "trust this folder"; then
        tmux send-keys -t "$SESSION" "" Enter
        echo "$(date '+%H:%M:%S') Trust-Dialog bestaetigt"
        TRUST_OK=1
        break
    fi
    if echo "$SCREEN" | grep -q "^❯"; then
        echo "$(date '+%H:%M:%S') Claude direkt bereit"
        TRUST_OK=1
        break
    fi
done

# Bei --force: Watchdog wieder starten
if [ "$FORCE" = "1" ]; then
    systemctl start aria-watchdog.timer 2>/dev/null
    echo "$(date '+%H:%M:%S') Watchdog wieder aktiviert"
fi

if [ "$TRUST_OK" = "0" ]; then
    log "FEHLER: Restart fehlgeschlagen (Grund: $RESTART_REASON, Trust-Dialog Timeout)"
    telegram_notify "$(printf '❌ <b>Aria Restart fehlgeschlagen</b>\nGrund: %s\nTrust-Dialog Timeout' "$RESTART_REASON")"
    tmux kill-session -t "$SESSION" 2>/dev/null
    exit 1
fi

# 6. Warten bis bereit (Wrapper sendet Resume-Prompt automatisch)
for i in $(seq 1 45); do
    sleep 2
    if ! tmux has-session -t "$SESSION" 2>/dev/null; then
        log "FEHLER: Session nach Trust-Dialog gestorben (Grund: $RESTART_REASON)"
        telegram_notify "$(printf '❌ <b>Aria Restart fehlgeschlagen</b>\nSession nach Trust-Dialog gestorben.')"
        exit 1
    fi
    if tmux capture-pane -t "$SESSION" -p 2>/dev/null | grep -q "^❯"; then
        log "Aria neugestartet (erfolgreich, Grund: $RESTART_REASON)"
        # Telegram Bot Commands wiederherstellen (Plugin setzt nur 3 Basis-Commands beim Start)
        sleep 3
        if [ -n "$BOT_TOKEN" ]; then
            curl -s -X POST "https://api.telegram.org/bot${BOT_TOKEN}/setMyCommands" \
                -H "Content-Type: application/json" \
                -d '{
                  "commands": [
                    {"command": "status",      "description": "Service-Status aller laufenden Systeme"},
                    {"command": "briefing",    "description": "Morgenbriefing jetzt ausführen"},
                    {"command": "health",      "description": "Vollständiger Health-Check"},
                    {"command": "logs",        "description": "Letzte System-Logs anzeigen"},
                    {"command": "linear",      "description": "Offene Linear-Tasks anzeigen"},
                    {"command": "calendar",    "description": "Heutige Termine"},
                    {"command": "news",        "description": "KI-News Briefing jetzt"},
                    {"command": "obsidiansync","description": "Obsidian Vault manuell syncen"},
                    {"command": "mails",       "description": "Ungelesene wichtige Mails anzeigen"},
                    {"command": "start",       "description": "Welcome and setup guide"},
                    {"command": "help",        "description": "What this bot can do"}
                  ]
                }' > /dev/null 2>&1
            echo "$(date '+%H:%M:%S') Telegram Bot Commands wiederhergestellt"
        fi
        LOG_TAIL=$(tail -3 "$LOG" 2>/dev/null | sed 's/&/\&amp;/g; s/</\&lt;/g; s/>/\&gt;/g')
        telegram_notify "$(printf '🔄 <b>Aria neugestartet</b>\nGrund: %s\nZeit: %s\n\n<code>%s</code>' "$RESTART_REASON" "$(date '+%H:%M:%S')" "$LOG_TAIL")"
        echo "$(date '+%H:%M:%S') Aria neugestartet und bereit"
        exit 0
    fi
done

# Session laeuft aber Prompt nicht sichtbar
if tmux has-session -t "$SESSION" 2>/dev/null; then
    log "Aria neugestartet (Prompt-Wait Timeout, Session laeuft, Grund: $RESTART_REASON)"
    # Telegram Bot Commands wiederherstellen auch im Timeout-Pfad
    if [ -n "$BOT_TOKEN" ]; then
        curl -s -X POST "https://api.telegram.org/bot${BOT_TOKEN}/setMyCommands" \
            -H "Content-Type: application/json" \
            -d '{
              "commands": [
                {"command": "status",      "description": "Service-Status aller laufenden Systeme"},
                {"command": "briefing",    "description": "Morgenbriefing jetzt ausführen"},
                {"command": "health",      "description": "Vollständiger Health-Check"},
                {"command": "logs",        "description": "Letzte System-Logs anzeigen"},
                {"command": "linear",      "description": "Offene Linear-Tasks anzeigen"},
                {"command": "calendar",    "description": "Heutige Termine"},
                {"command": "news",        "description": "KI-News Briefing jetzt"},
                {"command": "obsidiansync","description": "Obsidian Vault manuell syncen"},
                {"command": "mails",       "description": "Ungelesene wichtige Mails anzeigen"},
                {"command": "start",       "description": "Welcome and setup guide"},
                {"command": "help",        "description": "What this bot can do"}
              ]
            }' > /dev/null 2>&1
    fi
    telegram_notify "$(printf '🔄 <b>Aria neugestartet</b>\nGrund: %s\n(Plugins laden noch...)' "$RESTART_REASON")"
    echo "$(date '+%H:%M:%S') Aria gestartet (Plugins laden noch...)"
    exit 0
fi

log "FEHLER: Restart komplett fehlgeschlagen (Grund: $RESTART_REASON)"
telegram_notify "$(printf '❌ <b>Aria Restart fehlgeschlagen</b>\nGrund: %s\nManuell pruefen.' "$RESTART_REASON")"
exit 1
