#!/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"

# 12.08.2026 Watchdog-Architektur-Fix (Root-Cause: brain/post-mortem/2026-07-14-root-migration.md
# + brain/02-Wissen/watchdog-incident-2026-08-12.md). Dieses Script laeuft (ueber Control-Panel/
# n8n) als root, aber aria.service (und damit die echte tmux-Session) laeuft seit der
# 14.07.-Migration als User aria. tmux-Sockets sind pro-UID — ein blankes "tmux ..." als root
# sieht nie aria's Session. tmux_aria() traegt den expliziten Socket-Pfad.
ARIA_SYS_UID=$(id -u aria 2>/dev/null || echo 1001)
TMUX_SOCK="/tmp/tmux-${ARIA_SYS_UID}/default"
tmux_aria() { tmux -S "$TMUX_SOCK" "$@"; }
# ARIA_RESTART_DRYRUN=1 loggt nur, ohne echten Restart/Kill auszuloesen.
DRYRUN="${ARIA_RESTART_DRYRUN:-0}"

# 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, Dryrun: $DRYRUN)..."
log "Restart angefordert (Grund: $RESTART_REASON, Force: $FORCE, Dryrun: $DRYRUN)"

if [ "$DRYRUN" = "1" ]; then
    echo "$(date '+%H:%M:%S') DRYRUN: Sentinel-Write, Cooldown-Clear und Watchdog-Stop uebersprungen"
else
    # 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
fi

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

restore_telegram_commands() {
    [ -z "$BOT_TOKEN" ] && return
    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"
}

# 2. Aria neu starten
# 12.08.2026 Watchdog-Architektur-Fix (Root-Cause: brain/post-mortem/2026-07-14-root-migration.md
# + brain/02-Wissen/watchdog-incident-2026-08-12.md). Dieser Abschnitt baute frueher manuell eine
# EIGENE root-tmux-Session mit dem veralteten aria-wrapper.sh — lief als root, GENAU der Fall, den
# Claude Code seit 2.1.x hart verweigert ("--dangerously-skip-permissions cannot be used with
# root/sudo"). aria.service (User=aria, Restart=always) + das aktuelle wrapper.sh sind die einzige
# gepflegte Startlogik — dieses Script ruft sie jetzt ueber systemd auf statt an ihr vorbei eine
# zweite, kaputte Welt zu bauen. Kein manuelles pkill/SIGKILL-Ballett und kein Trust-Dialog-Warten
# mehr noetig: systemd uebernimmt Stop (graceful SIGTERM, TimeoutStopSec=30; bei --force sofortiges
# SIGKILL vorab) und Start; wrapper.sh erzeugt seine eigene, korrekt user-scoped tmux-Session selbst.
if [ "$DRYRUN" = "1" ]; then
    log "DRYRUN: wuerde $( [ "$FORCE" = "1" ] && echo "systemctl kill --signal=SIGKILL aria.service + " )systemctl restart aria.service ausfuehren (Grund: $RESTART_REASON)"
    echo "$(date '+%H:%M:%S') DRYRUN: kein echter Restart ausgefuehrt (auch Grace-Period-Datei unangetastet)"
    exit 0
fi

# Grace Period setzen - Watchdog soll Telegram-Check nach dem Restart nicht sofort greifen
date +%s > /tmp/aria-restart-grace

if [ "$FORCE" = "1" ]; then
    systemctl kill --signal=SIGKILL aria.service 2>/dev/null
fi
if systemctl is-failed --quiet aria.service 2>/dev/null; then
    log "aria.service im failed-State (StartLimitBurst erreicht) - reset-failed vor Restart"
    systemctl reset-failed aria.service 2>/dev/null
fi
systemctl restart aria.service 2>/dev/null
echo "$(date '+%H:%M:%S') systemctl restart aria.service ausgefuehrt, warte auf Claude..."

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

# 3. Warten bis bereit (wrapper.sh sendet Resume-Prompt automatisch)
for i in $(seq 1 45); do
    sleep 2
    if ! tmux_aria has-session -t "$SESSION" 2>/dev/null; then
        continue  # Session evtl. noch nicht neu erzeugt (systemd-Stop-Sequenz laeuft) - weiter warten
    fi
    if tmux_aria 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
        restore_telegram_commands
        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_aria has-session -t "$SESSION" 2>/dev/null; then
    log "Aria neugestartet (Prompt-Wait Timeout, Session laeuft, Grund: $RESTART_REASON)"
    restore_telegram_commands
    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\n<code>journalctl -u aria.service -n 40 --no-pager</code> pruefen.' "$RESTART_REASON")"
exit 1
