#!/bin/sh
# install.sh — installateur one-liner de l'agent StatHall (ADR-0008/0009).
#
#   curl -fsSL https://www.stathall.com/agent/install.sh | sudo sh -s <token>
#
# Étapes : détecte la distro → ajoute la clé GPG + le dépôt APT →
# apt install stathall-agent → écrit /etc/stathall-agent/config.ini →
# register-host (gère 201/200/409/401 avec rollback propre) →
# systemctl enable --now.
set -eu

INGEST_URL="${STATHALL_INGEST_URL:-https://app.stathall.com}"
APT_REPO="${STATHALL_APT_REPO:-https://apt.stathall.com}"
KEYRING="/usr/share/keyrings/stathall-archive-keyring.gpg"
CONFIG_DIR="/etc/stathall-agent"
STATE_DIR="/var/lib/stathall-agent"

die() { echo "❌ $1" >&2; exit 1; }

[ "$(id -u)" -eq 0 ] || die "À lancer en root (sudo)."
TOKEN="${1:-}"
[ -n "$TOKEN" ] || die "Usage : install.sh <token-agent>"

# --- 1. Détection de la distribution ---------------------------------------
. /etc/os-release 2>/dev/null || die "/etc/os-release introuvable — distro non supportée."
case "${ID:-}" in
    debian|ubuntu) ;;
    *) die "Distro '${ID:-?}' non supportée en V2.0 (Debian 12 / Ubuntu 22.04+ uniquement)." ;;
esac
command -v python3 >/dev/null 2>&1 || die "python3 (>= 3.10) requis."

echo "→ Distribution : ${PRETTY_NAME:-$ID}"

# --- 2. Dépôt APT signé GPG -------------------------------------------------
echo "→ Ajout de la clé GPG + du dépôt APT StatHall"
curl -fsSL "${APT_REPO}/stathall-archive-keyring.gpg" -o "$KEYRING" \
    || die "Téléchargement de la clé GPG échoué."
echo "deb [signed-by=${KEYRING}] ${APT_REPO} stable main" \
    > /etc/apt/sources.list.d/stathall.list

# --- 3. Installation du paquet ---------------------------------------------
echo "→ apt update && apt install stathall-agent"
apt-get update -qq
DEBIAN_FRONTEND=noninteractive apt-get install -y -qq stathall-agent \
    || die "Installation du paquet échouée."

# --- 4. Configuration ------------------------------------------------------
echo "→ Écriture de ${CONFIG_DIR}/config.ini (chmod 600)"
install -d -m 0755 "$CONFIG_DIR"
umask 077
cat > "${CONFIG_DIR}/config.ini" <<EOF
[agent]
ingest_url = ${INGEST_URL}
token = ${TOKEN}
push_interval_seconds = 60
EOF
chmod 600 "${CONFIG_DIR}/config.ini"

# --- 5. Enregistrement de l'hôte (register-host) ---------------------------
# On laisse l'agent générer son host-id puis on appelle register-host via un
# court run Python (réutilise la logique transport/config de l'agent).
echo "→ Enregistrement de l'hôte auprès du cockpit"
REGISTER_RC=0
PYTHONPATH=/usr/lib/stathall-agent python3 - <<'PYEOF' || REGISTER_RC=$?
import sys
from stathall_agent import __version__
from stathall_agent.config import load_config, system_facts
from stathall_agent.transport import Transport

config = load_config()
result = Transport(config).register_host({
    "host_id": config.host_id,
    "host_fingerprint": config.host_fingerprint,
    "agent_version": __version__,
    **system_facts(),
})
if result.status in (200, 201):
    print(f"  ✓ register-host OK (HTTP {result.status})")
    sys.exit(0)
if result.status == 409:
    masked = result.body.get("bound_host_fingerprint_masked", "?")
    print(f"  ✗ 409 : ce token est déjà lié à un autre serveur ({masked}).", file=sys.stderr)
    sys.exit(9)
print(f"  ✗ register-host refusé (HTTP {result.status}) : {result.body}", file=sys.stderr)
sys.exit(1)
PYEOF

if [ "$REGISTER_RC" -eq 9 ]; then
    # 409 binding drift — rollback propre, aucune unité activée (ADR-0009).
    echo "" >&2
    echo "Impossible d'enregistrer ce serveur : le token fourni est déjà" >&2
    echo "utilisé par un autre serveur. Dans le cockpit StatHall :" >&2
    echo "  → cible serveur → onglet « Agent » → « Réinitialiser le binding »" >&2
    echo "  → ou régénérez le token, puis relancez cette commande." >&2
    rm -rf "$CONFIG_DIR" "$STATE_DIR"
    die "Installation annulée (config nettoyée)."
elif [ "$REGISTER_RC" -ne 0 ]; then
    rm -rf "$CONFIG_DIR" "$STATE_DIR"
    die "register-host a échoué (token invalide/révoqué ?). Config nettoyée."
fi

# --- 6. Démarrage du service -----------------------------------------------
echo "→ systemctl enable --now stathall-agent"
systemctl enable --now stathall-agent.service

sleep 2
if systemctl is-active --quiet stathall-agent.service; then
    echo ""
    echo "✅ Agent StatHall installé et démarré. La télémétrie remonte dans"
    echo "   le cockpit sous quelques minutes."
else
    echo "⚠️  Le service n'est pas actif — voir : journalctl -u stathall-agent" >&2
    exit 1
fi
