#!/usr/bin/env bash
# Installe MEA Local Agent en tant que LaunchAgent (session utilisateur).
set -euo pipefail

SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
INSTALL_DIR="$HOME/Library/Application Support/MEA/LocalAgent"
PLIST_LABEL="com.mea.localagent"
PLIST_PATH="$HOME/Library/LaunchAgents/$PLIST_LABEL.plist"
LOG_PATH="$HOME/Library/Logs/mea-local-agent.log"

# ── Sélection de l'architecture ───────────────────────────────────────────────
ARCH="$(uname -m)"
if [[ "$ARCH" == "arm64" ]]; then
    RID="osx-arm64"
else
    RID="osx-x64"
fi

BINARY_SRC_DIR="$SCRIPT_DIR/publish/$RID"
BINARY_SRC="$BINARY_SRC_DIR/Mea.LocalAgent"

if [[ ! -f "$BINARY_SRC" ]]; then
    echo "❌ Binaire introuvable : $BINARY_SRC"
    echo "   Exécutez d'abord : ./build.sh"
    exit 1
fi

echo "=== Installation de MEA Local Agent ==="
echo "   Architecture : $ARCH ($RID)"
echo ""

# ── Installation de SANE (requis pour la numérisation) ───────────────────────
install_sane() {
    if command -v scanimage &>/dev/null; then
        echo "   ✔ SANE déjà installé ($(scanimage --version 2>&1 | head -1))."
        return
    fi

    echo "→ SANE (sane-backends) non détecté — nécessaire pour la numérisation."

    if ! command -v brew &>/dev/null; then
        echo ""
        echo "   ⚠  Homebrew introuvable. Installez-le depuis https://brew.sh,"
        echo "      puis relancez ce script, ou installez SANE manuellement :"
        echo "        brew install sane-backends"
        echo ""
        read -r -p "   Continuer sans SANE ? (la numérisation sera indisponible) [y/N] : " SKIP_SANE
        if [[ "${SKIP_SANE,,}" != "y" ]]; then
            echo "Installation annulée."
            exit 1
        fi
        return
    fi

    echo "   Homebrew détecté — installation de sane-backends..."
    brew install sane-backends
    echo "   ✔ SANE installé."
}

install_sane
echo ""

# ── Configuration interactive ─────────────────────────────────────────────────
read -r -p "Archive de mise en attente – StagingRoot [${HOME}/MEA/Staging] : " STAGING_ROOT
STAGING_ROOT="${STAGING_ROOT:-$HOME/MEA/Staging}"

while true; do
    read -r -p "Port de l'agent (1024–65535) [8100] : " AGENT_PORT
    AGENT_PORT="${AGENT_PORT:-8100}"
    if [[ "$AGENT_PORT" =~ ^[0-9]+$ ]] && (( AGENT_PORT >= 1024 && AGENT_PORT <= 65535 )); then
        break
    fi
    echo "  ⚠  Le port doit être un entier entre 1024 et 65535."
done

# ── Bootstrap HTTPS client (optionnel) ────────────────────────────────────────
# Confiance du cert serveur MEA on-prem + entrée /etc/hosts → https://<hôte> de confiance
# (secure context navigateur → E2EE). Via env (MEA_SERVER_HOST/_IP/_CERT_SHA256) pour un
# déploiement non-interactif, sinon demandé. Vide = étape ignorée.
SERVER_HOST="${MEA_SERVER_HOST:-}"
SERVER_IP="${MEA_SERVER_IP:-}"
CERT_SHA256="${MEA_CERT_SHA256:-}"
if [ -z "$SERVER_HOST" ]; then
    read -r -p "Hôte serveur MEA on-prem pour le HTTPS (ex. mearchiver.local ; vide = ignorer) : " SERVER_HOST
fi
if [ -n "$SERVER_HOST" ] && [ -z "$CERT_SHA256" ]; then
    read -r -p "  Empreinte SHA-256 du cert serveur (épinglage) : " CERT_SHA256
    read -r -p "  IP du serveur pour /etc/hosts (vide si DNS résout) : " SERVER_IP
fi

# Origine CORS du serveur on-prem (sinon le navigateur sur mearchiver.local est bloqué).
CORS_EXTRA=""
if [ -n "$SERVER_HOST" ]; then CORS_EXTRA=", \"https://${SERVER_HOST}\""; fi

echo ""
echo "Répertoire d'installation : $INSTALL_DIR"

# ── Arrêter l'éventuelle instance en cours ────────────────────────────────────
if launchctl list 2>/dev/null | grep -q "$PLIST_LABEL"; then
    echo "→ Arrêt de l'agent existant..."
    launchctl unload "$PLIST_PATH" 2>/dev/null || true
    sleep 1
fi

# ── Copie des fichiers ────────────────────────────────────────────────────────
mkdir -p "$INSTALL_DIR"
mkdir -p "$STAGING_ROOT"
mkdir -p "$HOME/Library/LaunchAgents"
mkdir -p "$HOME/Library/Logs"

# Copie du répertoire de publication complet (runtime .NET inclus)
cp -R "$BINARY_SRC_DIR/" "$INSTALL_DIR/"
chmod +x "$INSTALL_DIR/Mea.LocalAgent"

# ── Écriture de appsettings.json ──────────────────────────────────────────────
cat > "$INSTALL_DIR/appsettings.json" <<APPSETTINGS
{
  "Agent": {
    "StagingRoot": "${STAGING_ROOT}"
  },
  "Cors": {
    "AllowAnyNetworkIpOrigin": true,
    "AllowedOrigins": ["http://localhost:3000", "http://127.0.0.1:3000"${CORS_EXTRA}]
  },
  "Network": {
    "AllowRemoteAccess": true,
    "Port": ${AGENT_PORT}
  },
  "Escl": {
    "DiscoveryTimeoutSeconds": 3,
    "ManualHosts": []
  },
  "Logging": {
    "LogLevel": {
      "Default": "Information",
      "Microsoft.Hosting.Lifetime": "Information"
    }
  }
}
APPSETTINGS

# ── Écriture du LaunchAgent plist ─────────────────────────────────────────────
# Les chemins avec espaces sont supportés grâce aux balises <string> individuelles.
cat > "$PLIST_PATH" <<PLIST
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN"
  "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
    <key>Label</key>
    <string>${PLIST_LABEL}</string>

    <key>ProgramArguments</key>
    <array>
        <string>${INSTALL_DIR}/Mea.LocalAgent</string>
    </array>

    <key>WorkingDirectory</key>
    <string>${INSTALL_DIR}</string>

    <key>EnvironmentVariables</key>
    <dict>
        <key>DOTNET_ENVIRONMENT</key>
        <string>Production</string>
    </dict>

    <key>RunAtLoad</key>
    <true/>

    <key>KeepAlive</key>
    <true/>

    <key>StandardOutPath</key>
    <string>${LOG_PATH}</string>

    <key>StandardErrorPath</key>
    <string>${LOG_PATH}</string>
</dict>
</plist>
PLIST

# ── Chargement du LaunchAgent ─────────────────────────────────────────────────
launchctl load "$PLIST_PATH"

# ── Bootstrap HTTPS client : épinglage + confiance du cert serveur (sudo) ─────
if [ -n "$SERVER_HOST" ] && [ -n "$CERT_SHA256" ]; then
    echo ""
    echo "→ Confiance du serveur MEA ($SERVER_HOST) — sudo requis (trousseau Système + /etc/hosts)…"
    bash "$(cd "$(dirname "$0")" && pwd)/configure-server-trust.sh" "$SERVER_IP" "$SERVER_HOST" "$CERT_SHA256" \
        || echo "  ⚠  Bootstrap HTTPS client échoué (voir ci-dessus)."
fi

echo ""
echo "✅ MEA Local Agent installé et démarré."
echo ""
echo "   Port     : $AGENT_PORT"
echo "   Staging  : $STAGING_ROOT"
echo "   Logs     : $LOG_PATH"
echo "   Config   : $INSTALL_DIR/appsettings.json"
echo ""
echo "   Pour vérifier l'état  : launchctl list $PLIST_LABEL"
echo "   Pour désinstaller     : ./uninstall.sh"
