#!/usr/bin/env bash
# Instalador del nucleo de JARVIS. Prepara el entorno de Python, el modelo de
# Ollama y comprueba los servicios externos. No descarga modelos pesados ni
# toca el sistema sin avisar.
set -uo pipefail

AQUI=$(cd -P "$(dirname "${BASH_SOURCE[0]:-$0}")" && pwd)
cd "$AQUI"

ok()   { printf '  \033[32mok\033[0m   %s\n' "$*"; }
falta(){ printf '  \033[33mfalta\033[0m %s\n' "$*"; }
malo() { printf '  \033[31mERROR\033[0m %s\n' "$*"; }

echo "JARVIS — instalacion"
echo

# ── Detectar el entorno (para no asumir Debian ni NVIDIA) ───────────────────
for g in apt dnf pacman zypper; do command -v "$g" >/dev/null && { PKG=$g; break; }; done
: "${PKG:=desconocido}"

if command -v nvidia-smi >/dev/null 2>&1; then GPU="NVIDIA (CUDA)"
elif command -v rocminfo >/dev/null 2>&1;  then GPU="AMD (ROCm)"
else GPU="ninguna → CPU"; fi

echo "0. Entorno"
ok "gestor de paquetes: $PKG"
ok "GPU detectada: $GPU"
[ "$GPU" = "ninguna → CPU" ] && echo "     (sin GPU va igual, mas lento; considera qwen3.5:2b)"
echo

# ── 1. Servicios externos (los instala el usuario; aqui solo se comprueban) ──
echo "1. Servicios externos"
command -v python3 >/dev/null && ok "python3 $(python3 -V 2>&1 | awk '{print $2}')" \
    || { malo "python3 no esta (instalalo con tu gestor: $PKG)"; exit 1; }
command -v ollama  >/dev/null && ok "ollama" \
    || falta "ollama — instalalo desde https://ollama.com (es el cerebro)"
command -v whisper-server >/dev/null && ok "whisper-server (STT)" \
    || falta "whisper.cpp para tu plataforma ($GPU) — ver config/README_whisper_gpu.md"
command -v piper >/dev/null && ok "piper (TTS)" \
    || falta "piper — https://github.com/rhasspy/piper (la voz)"
echo

# ── 2. Entorno de Python del nucleo ─────────────────────────────────────────
echo "2. Entorno de Python"
if [ ! -d nucleo/venv ]; then
    python3 -m venv nucleo/venv && ok "creado nucleo/venv"
else
    ok "nucleo/venv ya existe"
fi
nucleo/venv/bin/pip install -q --upgrade pip >/dev/null 2>&1
if nucleo/venv/bin/pip install -q -r requirements.txt; then
    ok "dependencias instaladas"
else
    malo "fallo instalando dependencias (ver requirements.txt)"; exit 1
fi
echo

# ── 3. El modelo de Ollama ──────────────────────────────────────────────────
echo "3. El modelo"
if command -v ollama >/dev/null; then
    if ollama list 2>/dev/null | grep -q '^qwen3.5:4b-jarvis'; then
        ok "qwen3.5:4b-jarvis ya existe"
    else
        echo "  creando qwen3.5:4b-jarvis (necesita qwen3.5:4b en Ollama)..."
        if ollama create qwen3.5:4b-jarvis -f config/qwen3.5-4b-jarvis.Modelfile 2>/dev/null; then
            ok "modelo creado"
        else
            falta "no se pudo crear; baja el base con: ollama pull qwen3.5:4b"
        fi
    fi
else
    falta "sin ollama no hay modelo; instalalo y re-ejecuta"
fi
echo

# ── 4. Lanzador de escritorio (icono en el menu de aplicaciones) ────────────
echo "4. Lanzador de escritorio"
APPS="$HOME/.local/share/applications"
ICONO="$AQUI/jarvis-icon.png"
[ -f "$ICONO" ] || ICONO="$AQUI/jarvis-icon.svg"
mkdir -p "$APPS"
cat > "$APPS/jarvis.desktop" <<DESKTOP
[Desktop Entry]
Type=Application
Name=JARVIS
GenericName=Asistente de voz local
Comment=Asistente de voz 100% local
Exec=$AQUI/nucleo/arranca.sh
Icon=$ICONO
Terminal=false
Categories=Utility;Accessibility;
StartupNotify=true
StartupWMClass=jarvis-nucleo
Keywords=jarvis;asistente;voz;
Actions=detener;

[Desktop Action detener]
Name=Detener JARVIS
Exec=$AQUI/nucleo/arranca.sh --stop
DESKTOP
chmod +x "$APPS/jarvis.desktop" 2>/dev/null
command -v update-desktop-database >/dev/null && update-desktop-database "$APPS" 2>/dev/null
ok "creado $APPS/jarvis.desktop — busca «JARVIS» en el menu de aplicaciones"
echo

# ── 5. Siguiente paso ───────────────────────────────────────────────────────
echo "Hecho. Ya puedes:"
echo "  · buscar JARVIS en el menu de aplicaciones y pulsar el icono, o"
echo "  · ./nucleo/arranca.sh          # arrancar a mano (panel en 127.0.0.1)"
echo "  · ./nucleo/saber/indexa.py     # (opcional) indexar tus apuntes para el RAG"
