#!/bin/bash
# G Radio AoIP — instalador
set -e
cd "$(dirname "$0")"

BIN_DIR="$HOME/.local/bin"
SERVICE_DIR="$HOME/.config/systemd/user"
CONFIG_DIR="$HOME/.config/gr-aoip"

# ── 1. Verificar e instalar dependencias del sistema ──────────────────────────
echo "==> Verificando dependencias..."

# Detectar gestor de paquetes
if command -v apt &>/dev/null; then
    PKG_MGR="apt"
    # Paquetes mínimos para los tres perfiles (MPX, Estéreo, Mono)
    PKGS=(
        libgstreamer1.0-0
        libglib2.0-0
        gstreamer1.0-plugins-base
        gstreamer1.0-plugins-good
        gstreamer1.0-plugins-bad
        gstreamer1.0-alsa
    )
    # Paquetes opcionales para Opus/AAC/MP3
    PKGS_OPT=(
        gstreamer1.0-plugins-ugly
        gstreamer1.0-libav
    )
    # Verificar cuáles faltan
    MISSING=()
    for pkg in "${PKGS[@]}"; do
        if ! dpkg -l "$pkg" 2>/dev/null | grep -q "^ii"; then
            MISSING+=("$pkg")
        fi
    done
    if [ ${#MISSING[@]} -gt 0 ]; then
        echo "  Faltan: ${MISSING[*]}"
        echo "  Instalando dependencias de GStreamer..."
        if command -v sudo &>/dev/null; then
            sudo apt-get install -y "${MISSING[@]}"
        else
            apt-get install -y "${MISSING[@]}" || {
                echo "[!] No se pudo instalar dependencias (sin sudo)."
                echo "    Instala manualmente: apt install ${MISSING[*]}"
            }
        fi
    else
        echo "  Dependencias OK."
    fi
    # Opcional: instalar codecs extra si no están
    MISSING_OPT=()
    for pkg in "${PKGS_OPT[@]}"; do
        if ! dpkg -l "$pkg" 2>/dev/null | grep -q "^ii"; then
            MISSING_OPT+=("$pkg")
        fi
    done
    if [ ${#MISSING_OPT[@]} -gt 0 ]; then
        echo "  Instalando codecs opcionales (Opus/AAC/MP3)..."
        if command -v sudo &>/dev/null; then
            sudo apt-get install -y "${MISSING_OPT[@]}" 2>/dev/null || \
                echo "  (algunos codecs opcionales no disponibles en este repositorio)"
        fi
    fi

elif command -v dnf &>/dev/null; then
    PKG_MGR="dnf"
    PKGS=(
        gstreamer1
        gstreamer1-plugins-base
        gstreamer1-plugins-good
        gstreamer1-plugins-bad-free
        glib2
    )
    MISSING=()
    for pkg in "${PKGS[@]}"; do
        rpm -q "$pkg" &>/dev/null || MISSING+=("$pkg")
    done
    if [ ${#MISSING[@]} -gt 0 ]; then
        echo "  Instalando: ${MISSING[*]}"
        sudo dnf install -y "${MISSING[@]}"
    else
        echo "  Dependencias OK."
    fi

else
    echo "  [!] Gestor de paquetes no reconocido (apt/dnf)."
    echo "  Instala manualmente: libgstreamer1.0, gst-plugins-base/good/bad"
fi

echo "==> Instalando gr-aoip..."

# Buscar el binario: primero en la raíz del ZIP (distribución binaria),
# luego en target/release/ (compilación desde fuente).
if [ -f "./gr-aoip" ]; then
    BINARY="./gr-aoip"
elif [ -f "target/release/gr-aoip" ]; then
    BINARY="target/release/gr-aoip"
else
    echo "[!] Binario no encontrado."
    echo "    Si usas el ZIP de distribución: asegúrate de descomprimir el archivo"
    echo "    completo y ejecutar install.sh desde dentro de la carpeta extraída."
    echo "    Si compilas desde fuente: cargo build --release"
    exit 1
fi

# Verificar compatibilidad del binario con el sistema
BIN_ARCH=$(file "$BINARY" 2>/dev/null | grep -oE "32-bit|64-bit")
SYS_ARCH=$(uname -m)
ELF_INTERP=$(readelf -l "$BINARY" 2>/dev/null | grep "interpreter" | grep -oE '/[^ ]+' | tr -d ']')

if [ -n "$ELF_INTERP" ] && [ ! -f "$ELF_INTERP" ]; then
    echo ""
    echo "[!] Este binario ($BIN_ARCH ARM) no es compatible con este sistema ($SYS_ARCH)."
    echo "    Intérprete requerido: $ELF_INTERP — no encontrado."
    echo ""
    if echo "$SYS_ARCH" | grep -q "aarch64\|arm64"; then
        echo "    El sistema es de 64 bits. Opciones:"
        echo "    1. Usa el ZIP arm64:  GR-aoip-v*-arm64.zip"
        echo "    2. O instala compat:  sudo apt install libc6-armhf"
    fi
    echo ""
    exit 1
fi

echo "==> Binario: $BINARY ($BIN_ARCH)"
mkdir -p "$BIN_DIR" "$SERVICE_DIR" "$CONFIG_DIR"

cp "$BINARY" "$BIN_DIR/gr-aoip"
chmod +x "$BIN_DIR/gr-aoip"

# Crear configuración por defecto si no existe
if [ ! -f "$CONFIG_DIR/aoip.json" ]; then
    cat > "$CONFIG_DIR/aoip.json" << 'JSON'
{
  "mode": "rx",
  "profile": "mpx",
  "web_port": 7171,
  "audio_in": "default",
  "audio_out": "default",
  "network": {
    "destination_ip": "192.168.1.100",
    "destination_port": 5004,
    "listen_port": 5004
  },
  "mpx": {
    "sample_rate": 192000,
    "format": "S16LE",
    "processing_samples": 256,
    "jitter_buffer_ms": 50,
    "target_fill_pct": 50
  },
  "stereo": { "sample_rate": 48000, "codec": "opus", "bitrate_kbps": 256 },
  "mono":   { "sample_rate": 22050, "codec": "opus", "bitrate_kbps": 32 }
}
JSON
    echo "==> Config creada en $CONFIG_DIR/aoip.json"
fi

# Servicio systemd usuario
cat > "$SERVICE_DIR/gr-aoip.service" << SERVICE
[Unit]
Description=G Radio AoIP — Audio over IP
After=network.target sound.target

[Service]
Type=simple
ExecStart=$BIN_DIR/gr-aoip
Restart=on-failure
RestartSec=5
Environment=RUST_LOG=info

[Install]
WantedBy=default.target
SERVICE

systemctl --user daemon-reload
systemctl --user enable gr-aoip
echo ""
echo "✅  Instalado. Comandos:"
echo "    Iniciar:   systemctl --user start gr-aoip"
echo "    Estado:    systemctl --user status gr-aoip"
echo "    Logs:      journalctl --user -u gr-aoip -f"
echo "    Web UI:    http://localhost:7171"
echo ""
