#!/bin/bash
# =============================================================================
# init-lab.sh — Inicialización del laboratorio de IA local
# =============================================================================
#
# Uso:
#   chmod +x init-lab.sh
#   ./init-lab.sh
#
# Descripción:
#   Script de inicialización rápida del laboratorio. Crea la estructura de
#   directorios recomendada en el episodio, descarga los modelos esenciales
#   y genera un docker-compose.yml básico para empezar.
#
#   Este script está diseñado para que el oyente pueda poner en marcha su
#   laboratorio con un solo comando después de instalar Ollama y Docker.
#
#   Estructura que crea:
#     ~/lab-ia/
#     ├── docker/
#     │   ├── ollama/
#     │   ├── open-webui/
#     │   └── docker-compose.yml
#     ├── modelos/
#     ├── datos/
#     │   ├── notas/
#     │   ├── transcripciones/
#     │   └── embeddings/
#     ├── scripts/
#     └── config/
#         ├── ollama/
#         └── open-webui/
#
# Requisitos:
#   - Ollama instalado (ver 02-instalacion/setup-ollama.sh)
#   - Docker instalado (para el docker-compose.yml)
#   - Conexión a internet (para descargar modelos)
#   - ~5 GB de espacio libre
#
# =============================================================================

set -euo pipefail

# Colores
VERDE='\033[0;32m'
AMARILLO='\033[1;33m'
AZUL='\033[0;34m'
ROJO='\033[0;31m'
RESET='\033[0m'

# Directorio base del laboratorio
LAB_DIR="$HOME/lab-ia"

echo -e "${AZUL}╔══════════════════════════════════════════════════════╗${RESET}"
echo -e "${AZUL}║  🔬  Inicialización del Laboratorio de IA Local     ║${RESET}"
echo -e "${AZUL}║  Episodio 827 — Recursos IA: el botiquín del        ║${RESET}"
echo -e "${AZUL}║                 explorador                          ║${RESET}"
echo -e "${AZUL}╚══════════════════════════════════════════════════════╝${RESET}"
echo ""

# =============================================================================
# PASO 1: Comprobar requisitos
# =============================================================================
echo -e "${AZUL}[1/5] Comprobando requisitos...${RESET}"
echo ""

REQUISITOS_OK=true

# Ollama
echo -n "  Ollama: "
if command -v ollama &>/dev/null; then
    echo -e "${VERDE}✓${RESET}"
else
    echo -e "${ROJO}✗${RESET}"
    echo "    → Instala Ollama primero: curl -fsSL https://ollama.com/install.sh | sh"
    REQUISITOS_OK=false
fi

# Docker
echo -n "  Docker: "
if command -v docker &>/dev/null; then
    echo -e "${VERDE}✓${RESET}"
else
    echo -e "${AMARILLO}⚠${RESET}"
    echo "    → Docker no está instalado. El docker-compose.yml se creará igual."
    echo "    → Instálalo con: curl -fsSL https://get.docker.com | sh"
fi

# Espacio en disco (~5 GB necesarios)
echo -n "  Espacio en disco: "
ESPACIO_LIBRE=$(df -BG "$HOME" | tail -1 | awk '{print $4}' | sed 's/G//')
if [ "$ESPACIO_LIBRE" -ge 10 ]; then
    echo -e "${VERDE}✓${RESET} ($ESPACIO_LIBRE GB libres)"
elif [ "$ESPACIO_LIBRE" -ge 5 ]; then
    echo -e "${AMARILLO}⚠${RESET} ($ESPACIO_LIBRE GB libres — suficiente pero justo)"
else
    echo -e "${ROJO}✗${RESET} ($ESPACIO_LIBRE GB libres — necesitas al menos 5 GB)"
    REQUISITOS_OK=false
fi

echo ""

if [ "$REQUISITOS_OK" = false ]; then
    echo "  ERROR: Requisitos insuficientes. Revisa los mensajes anteriores."
    exit 1
fi

# =============================================================================
# PASO 2: Crear estructura de directorios
# =============================================================================
echo -e "${AZUL}[2/5] Creando estructura de directorios...${RESET}"
echo ""

mkdir -p "$LAB_DIR"
mkdir -p "$LAB_DIR/docker/ollama"
mkdir -p "$LAB_DIR/docker/open-webui"
mkdir -p "$LAB_DIR/modelos"
mkdir -p "$LAB_DIR/datos/notas"
mkdir -p "$LAB_DIR/datos/transcripciones"
mkdir -p "$LAB_DIR/datos/embeddings"
mkdir -p "$LAB_DIR/scripts"
mkdir -p "$LAB_DIR/config/ollama"
mkdir -p "$LAB_DIR/config/open-webui"

echo "  Estructura creada en: ${AZUL}${LAB_DIR}${RESET}"
echo ""
echo "  ${LAB_DIR}/"
echo "  ├── docker/"
echo "  │   ├── ollama/"
echo "  │   ├── open-webui/"
echo "  │   └── docker-compose.yml  (se crea a continuación)"
echo "  ├── modelos/"
echo "  ├── datos/"
echo "  │   ├── notas/"
echo "  │   ├── transcripciones/"
echo "  │   └── embeddings/"
echo "  ├── scripts/"
echo "  └── config/"
echo "      ├── ollama/"
echo "      └── open-webui/"
echo ""

# =============================================================================
# PASO 3: Crear docker-compose.yml básico
# =============================================================================
echo -e "${AZUL}[3/5] Creando docker-compose.yml básico...${RESET}"
echo ""

COMPOSE_FILE="$LAB_DIR/docker/docker-compose.yml"

cat > "$COMPOSE_FILE" << 'COMPOSE_EOF'
# =============================================================================
# docker-compose.yml — Laboratorio IA Local
# Generado por init-lab.sh del Episodio 827
# =============================================================================
#
# Uso:
#   docker compose up -d          # Levantar todos los servicios
#   docker compose down           # Detener todos los servicios
#   docker compose logs -f        # Ver logs en tiempo real
#
# Servicios:
#   - ollama:     Gestor de modelos de lenguaje (API en :11434)
#   - open-webui: Interfaz gráfica web (web en :3000)
#
# Requisitos:
#   - Docker Engine 24+ o Podman 4+
#   - Docker Compose v2+
#
# =============================================================================

services:
  # ---------------------------------------------------------------------------
  # Ollama — Gestor de modelos de lenguaje
  # ---------------------------------------------------------------------------
  ollama:
    image: ollama/ollama:latest
    container_name: ollama-server
    hostname: ollama
    volumes:
      # Persistencia de modelos descargados
      - ./ollama/models:/root/.ollama
    ports:
      # API REST de Ollama
      - "11434:11434"
    environment:
      # Mantener el modelo en memoria para respuestas más rápidas
      - OLLAMA_KEEP_ALIVE=5m
      # Número máximo de modelos cargados simultáneamente
      - OLLAMA_NUM_PARALLEL=1
      # Límite de contexto (ventana de tokens)
      - OLLAMA_CONTEXT_LENGTH=8192
    restart: unless-stopped
    healthcheck:
      test: ["CMD", "curl", "-f", "http://localhost:11434/api/tags"]
      interval: 30s
      timeout: 10s
      retries: 3
      start_period: 40s
    networks:
      - ia-local-net

  # ---------------------------------------------------------------------------
  # Open WebUI — Interfaz gráfica para chatear con modelos
  # ---------------------------------------------------------------------------
  open-webui:
    image: ghcr.io/open-webui/open-webui:main
    container_name: open-webui
    depends_on:
      ollama:
        condition: service_healthy
    volumes:
      # Persistencia de conversaciones, configuraciones, archivos subidos
      - ./open-webui/data:/app/backend/data
    ports:
      # Interfaz web
      - "3000:8080"
    environment:
      # URL del servicio Ollama (nombre del contenedor, no localhost)
      - OLLAMA_BASE_URL=http://ollama:11434
      # Tiempo máximo de espera para respuestas largas
      - WEBUI_TIMEOUT=300
    restart: unless-stopped
    healthcheck:
      test: ["CMD", "curl", "-f", "http://localhost:8080/health"]
      interval: 30s
      timeout: 10s
      retries: 3
      start_period: 60s
    networks:
      - ia-local-net

# ---------------------------------------------------------------------------
# Redes
# ---------------------------------------------------------------------------
networks:
  ia-local-net:
    name: ia-local-network
    driver: bridge
COMPOSE_EOF

echo -e "  ${VERDE}✓${RESET} docker-compose.yml creado en:"
echo "    $COMPOSE_FILE"
echo ""

# =============================================================================
# PASO 4: Descargar modelos esenciales
# =============================================================================
echo -e "${AZUL}[4/5] Descargando modelos esenciales...${RESET}"
echo ""

# Modelo de lenguaje pequeño (ideal para empezar)
MODELO_LENGUAJE="qwen2.5:3b"
echo "  Modelo de lenguaje: ${AMARILLO}${MODELO_LENGUAJE}${RESET}"
echo "  (~2 GB — recomendado para empezar)"
echo ""

if ollama list 2>/dev/null | grep -q "^${MODELO_LENGUAJE}\s"; then
    echo -e "  ${VERDE}✓${RESET} ${MODELO_LENGUAJE} ya está descargado."
else
    echo "  Descargando ${MODELO_LENGUAJE}..."
    echo "  (Esto puede tardar según tu conexión)"
    ollama pull "$MODELO_LENGUAJE"
    echo -e "  ${VERDE}✓${RESET} ${MODELO_LENGUAJE} descargado."
fi
echo ""

# Modelo de embeddings (para RAG y búsqueda semántica)
MODELO_EMBED="nomic-embed-text"
echo "  Modelo de embeddings: ${AMARILLO}${MODELO_EMBED}${RESET}"
echo "  (~0.3 GB — necesario para RAG y búsqueda semántica)"
echo ""

if ollama list 2>/dev/null | grep -q "^${MODELO_EMBED}\s"; then
    echo -e "  ${VERDE}✓${RESET} ${MODELO_EMBED} ya está descargado."
else
    echo "  Descargando ${MODELO_EMBED}..."
    ollama pull "$MODELO_EMBED"
    echo -e "  ${VERDE}✓${RESET} ${MODELO_EMBED} descargado."
fi
echo ""

# =============================================================================
# PASO 5: Crear script de respaldo básico
# =============================================================================
echo -e "${AZUL}[5/5] Creando script de respaldo básico...${RESET}"
echo ""

BACKUP_SCRIPT="$LAB_DIR/scripts/backup.sh"

cat > "$BACKUP_SCRIPT" << 'BACKUP_EOF'
#!/bin/bash
# backup.sh — Respaldo del laboratorio de IA local
#
# Uso:
#   ./backup.sh                    # Respaldo completo
#   ./backup.sh --modelos          # Solo respaldo de modelos
#   ./backup.sh --datos            # Solo respaldo de datos
#
# Descripción:
#   Crea una copia de seguridad de los elementos esenciales del laboratorio:
#   modelos descargados, configuraciones y datos generados.

set -euo pipefail

BACKUP_DIR="$HOME/lab-ia-backup-$(date +%Y%m%d)"
LAB_DIR="$HOME/lab-ia"

echo "=============================================="
echo "  Respaldo del Laboratorio IA Local"
echo "=============================================="
echo ""
echo "  Directorio de respaldo: $BACKUP_DIR"
echo ""

mkdir -p "$BACKUP_DIR"

# Respaldar configuración de Ollama
if [ -d "$HOME/.ollama" ]; then
    echo "  Respaldando modelos de Ollama..."
    cp -r "$HOME/.ollama" "$BACKUP_DIR/ollama"
    echo "  ✓ Modelos respaldados"
fi

# Respaldar docker-compose y configuraciones
if [ -d "$LAB_DIR/docker" ]; then
    echo "  Respaldando docker-compose..."
    cp -r "$LAB_DIR/docker" "$BACKUP_DIR/docker"
    echo "  ✓ Configuración Docker respaldada"
fi

# Respaldar scripts personalizados
if [ -d "$LAB_DIR/scripts" ]; then
    echo "  Respaldando scripts..."
    cp -r "$LAB_DIR/scripts" "$BACKUP_DIR/scripts"
    echo "  ✓ Scripts respaldados"
fi

echo ""
echo "  Respaldo completado en: $BACKUP_DIR"
echo "  Para restaurar: cp -r $BACKUP_DIR/* $HOME/"
echo "=============================================="
BACKUP_EOF

chmod +x "$BACKUP_SCRIPT"

echo -e "  ${VERDE}✓${RESET} Script de respaldo creado: $BACKUP_SCRIPT"
echo ""

# =============================================================================
# CIERRE
# =============================================================================
echo -e "${VERDE}╔══════════════════════════════════════════════════════╗${RESET}"
echo -e "${VERDE}║  ✅  Laboratorio inicializado con éxito             ║${RESET}"
echo -e "${VERDE}╚══════════════════════════════════════════════════════╝${RESET}"
echo ""
echo "  Tu laboratorio está listo en: ${AZUL}${LAB_DIR}${RESET}"
echo ""
echo "  Modelos descargados:"
ollama list 2>/dev/null | tail -n +2 | while read -r line; do
    echo "    • $line"
done
echo ""
echo "  Para empezar a usar tu laboratorio:"
echo ""
echo "    1. Abre la interfaz web (si tienes Docker):"
echo "       cd ${LAB_DIR}/docker"
echo "       docker compose up -d"
echo "       → http://localhost:3000"
echo ""
echo "    2. Chatea desde terminal:"
echo "       ollama run qwen2.5:3b \"¿Qué puedo hacer con IA local?\""
echo ""
echo "    3. Prueba la API REST:"
echo "       curl http://localhost:11434/api/tags"
echo ""
echo "    4. Haz un respaldo:"
echo "       ${LAB_DIR}/scripts/backup.sh"
echo ""
echo "  📖  Guía completa en: atareao.es/827"
echo ""
echo "  Próximo episodio (829): Skills imprescindibles para tu agente IA"
echo "  Vamos a enseñar al modelo a usar herramientas."
echo ""
echo "  Nos oímos el jueves. Sed felices. Y seguid trasteando."
echo ""
