#!/usr/bin/env bash
set -euo pipefail

HEALTH="$HOME/.local/bin/jarvis-health"
STATE_DIR="$HOME/.local/state/jarvis-watchdog"
STATE_FILE="$STATE_DIR/state"
LAST_REPORT="$STATE_DIR/last-health.txt"
LOCK_FILE="$STATE_DIR/lock"

mkdir -p "$STATE_DIR"
chmod 700 "$STATE_DIR"

# Trouver Hermes
if [[ -x "$HOME/.local/bin/hermes" ]]; then
    HERMES="$HOME/.local/bin/hermes"
else
    HERMES="$(command -v hermes || true)"
fi

if [[ -z "${HERMES:-}" ]]; then
    echo "ERREUR: commande hermes introuvable" >&2
    exit 2
fi

# Test Telegram sans toucher à l'état du watchdog
if [[ "${1:-}" == "--test-alert" ]]; then
    "$HERMES" send --to telegram --quiet \
        "🧪 JARVIS WATCHDOG
Ceci est une alerte de test.
Aucune anomalie réelle n'a été détectée."
    exit $?
fi

# Éviter deux exécutions simultanées
exec 9>"$LOCK_FILE"
flock -n 9 || exit 0

TMP="$(mktemp)"
CLEAN="$(mktemp)"
trap 'rm -f "$TMP" "$CLEAN"' EXIT

# Exécuter réellement jarvis-health
set +e
"$HEALTH" >"$TMP" 2>&1
RC=$?
set -e

# Retirer les éventuels codes couleur ANSI
sed -E 's/\x1B\[[0-9;]*[mK]//g' "$TMP" > "$CLEAN"

cp "$CLEAN" "$LAST_REPORT"
chmod 600 "$LAST_REPORT"

# Lire le statut produit par jarvis-health
HEALTH_STATUS="$(
    grep -E 'SANTÉ:[[:space:]]*(OK|DEGRADE|DÉGRADÉ|CRITIQUE)' "$CLEAN" \
    | tail -n 1 \
    | sed -E 's/.*SANTÉ:[[:space:]]*//' \
    || true
)"

if [[ "$RC" -eq 0 && "$HEALTH_STATUS" == "OK" ]]; then
    CURRENT="OK"
else
    case "$HEALTH_STATUS" in
        CRITIQUE)
            CURRENT="CRITIQUE"
            ;;
        DEGRADE|DÉGRADÉ)
            CURRENT="DEGRADE"
            ;;
        *)
            CURRENT="ERREUR"
            ;;
    esac
fi

PREVIOUS="UNKNOWN"

if [[ -f "$STATE_FILE" ]]; then
    PREVIOUS="$(cat "$STATE_FILE" 2>/dev/null || echo UNKNOWN)"
fi

send_message() {
    local message="$1"

    if printf '%s\n' "$message" \
        | "$HERMES" send --to telegram --quiet
    then
        return 0
    else
        echo "Échec envoi Telegram" >&2
        return 1
    fi
}

# Première exécution saine : mémoriser sans envoyer de notification
if [[ "$PREVIOUS" == "UNKNOWN" && "$CURRENT" == "OK" ]]; then
    echo "OK" > "$STATE_FILE"
    chmod 600 "$STATE_FILE"
    echo "Jarvis OK — état initial enregistré."
    exit 0
fi

# Aucun changement : ne rien envoyer
if [[ "$CURRENT" == "$PREVIOUS" ]]; then
    echo "État inchangé : $CURRENT"
    exit 0
fi

# Retour à la normale
if [[ "$CURRENT" == "OK" ]]; then
    MESSAGE="✅ JARVIS RÉTABLI

Jarvis est revenu à un état normal.

État précédent : $PREVIOUS
État actuel    : OK
Machine        : $(hostname)
Date           : $(date '+%Y-%m-%d %H:%M:%S')"

    if send_message "$MESSAGE"; then
        echo "OK" > "$STATE_FILE"
        chmod 600 "$STATE_FILE"
    fi

    exit 0
fi

# Construire un extrait utile de l'anomalie
DETAILS="$(
    grep -E '^\[(WARN|ERREUR|FAIL|CRITICAL)\]|SANTÉ:' "$CLEAN" \
    | tail -n 20 \
    || true
)"

if [[ -z "$DETAILS" ]]; then
    DETAILS="$(tail -n 20 "$CLEAN")"
fi

# Limiter la taille du message Telegram
DETAILS="$(printf '%s\n' "$DETAILS" | head -c 2500)"

case "$CURRENT" in
    CRITIQUE)
        ICON="🚨"
        ;;
    DEGRADE)
        ICON="⚠️"
        ;;
    *)
        ICON="❌"
        ;;
esac

MESSAGE="$ICON ALERTE JARVIS

État : $CURRENT
Machine : $(hostname)
Date : $(date '+%Y-%m-%d %H:%M:%S')
Code retour jarvis-health : $RC

$DETAILS

Réponds à Jarvis sur Telegram :
« Fais un diagnostic complet de cette anomalie avec jarvis-maintenance. »"

if send_message "$MESSAGE"; then
    echo "$CURRENT" > "$STATE_FILE"
    chmod 600 "$STATE_FILE"
fi
