#!/bin/bash

# Script de inicio robusto para Anexo76
# Este script inicializa el proyecto completo con validaciones

set -e

echo "========================================="
echo "   Anexo76 - Inicio Rápido"
echo "========================================="
echo ""

# Colores
GREEN='\033[0;32m'
BLUE='\033[0;34m'
YELLOW='\033[1;33m'
RED='\033[0;31m'
NC='\033[0m' # No Color

# Función para verificar si un servicio está saludable
wait_for_healthy() {
    local service=$1
    local max_attempts=60
    local attempt=1
    
    echo -e "${BLUE}Esperando a que ${service} esté saludable...${NC}"
    while [ $attempt -le $max_attempts ]; do
        if docker compose ps | grep "$service" | grep -q "healthy"; then
            echo -e "${GREEN}✓ ${service} está saludable${NC}"
            return 0
        fi
        echo "  Intento $attempt/$max_attempts..."
        sleep 3
        attempt=$((attempt + 1))
    done
    
    echo -e "${RED}✗ ${service} no estuvo disponible después de $max_attempts intentos${NC}"
    echo "Logs del servicio:"
    docker compose logs --tail=50 "$service"
    return 1
}

# 1. Verificar Docker
echo -e "${BLUE}[1/7] Verificando Docker...${NC}"
if ! command -v docker &> /dev/null; then
    echo -e "${RED}✗ Docker no está instalado. Por favor instala Docker primero.${NC}"
    exit 1
fi

if ! command -v docker compose &> /dev/null; then
    echo -e "${RED}✗ Docker Compose no está instalado. Por favor instala Docker Compose primero.${NC}"
    exit 1
fi

if ! docker info &> /dev/null; then
    echo -e "${RED}✗ Docker daemon no está corriendo. Por favor inicia Docker.${NC}"
    exit 1
fi

echo -e "${GREEN}✓ Docker está instalado y corriendo${NC}"
echo ""

# 2. Configurar variables de entorno
echo -e "${BLUE}[2/7] Configurando variables de entorno...${NC}"

if [ ! -f .env ]; then
    if [ -f .env.example ]; then
        cp .env.example .env
        echo -e "${GREEN}✓ Archivo .env creado desde .env.example${NC}"
    else
        echo -e "${YELLOW}⚠ .env.example no existe, creando .env básico${NC}"
        cat > .env <<EOF
POSTGRES_APP_PASSWORD=postgres
POSTGRES_KEYCLOAK_PASSWORD=postgres
KEYCLOAK_ADMIN=admin
KEYCLOAK_ADMIN_PASSWORD=admin
KEYCLOAK_REALM=master
KEYCLOAK_CLIENT_ID=anexo76-backend
KEYCLOAK_CLIENT_SECRET=dev-secret
KEYCLOAK_FRONTEND_CLIENT_ID=anexo76-frontend
DEBUG=True
ENVIRONMENT=development
NODE_ENV=development
VITE_API_URL=http://localhost:8000/api
VITE_KEYCLOAK_URL=http://localhost:8080/kcauth
EOF
    fi
fi

# Preguntar por el rol si no está definido o si el usuario quiere reconfigurar
if ! grep -q "VITE_HUB_MODE=" .env || [ "${RECONFIGURE:-false}" == "true" ]; then
    echo -e "${YELLOW}Configuración de Rol (Hub vs Cliente)${NC}"
    echo "1) Hub (Servidor Central)"
    echo "2) Cliente (Sucursal/Spoke)"
    read -p "Seleccione una opción [1-2, Enter para omitir]: " SERVER_ROLE

    if [ "$SERVER_ROLE" == "1" ] || [ "$SERVER_ROLE" == "2" ]; then
        GENERATED_TOKEN=$(openssl rand -hex 16 2>/dev/null || echo "dev-sync-token-$(date +%s)")
        read -p "Ingrese el Token de Sincronización Secreto [Presione Enter para generar uno aleatorio: $GENERATED_TOKEN]: " SYNC_TOKEN
        SYNC_TOKEN=${SYNC_TOKEN:-$GENERATED_TOKEN}
        
        if [ "$SERVER_ROLE" == "1" ]; then
            echo -e "${GREEN}Configurando como HUB...${NC}"
            CENTRAL_URL=""
            SPOKE_URLS=""
            HUB_MODE="true"
        else
            echo -e "${GREEN}Configurando como CLIENTE...${NC}"
            HUB_MODE="false"
            read -p "Ingrese la URL del Hub [http://100.78.6.108:8000/api/v1/core/help-center/sync/]: " CENTRAL_URL
            CENTRAL_URL=${CENTRAL_URL:-http://100.78.6.108:8001/api/v1/core/help-center/sync/}
            SPOKE_URLS=""
        fi

        # Aplicar configuraciones
        sed -i "s|^CENTRAL_SERVER_URL=.*|CENTRAL_SERVER_URL=$CENTRAL_URL|" .env 2>/dev/null || echo "CENTRAL_SERVER_URL=$CENTRAL_URL" >> .env
        sed -i "s|^SPOKE_URLS=.*|SPOKE_URLS=$SPOKE_URLS|" .env 2>/dev/null || echo "SPOKE_URLS=$SPOKE_URLS" >> .env
        if ! grep -q "SYNC_SECRET_TOKEN=" .env; then
            echo "SYNC_SECRET_TOKEN=$SYNC_TOKEN" >> .env
        fi
        
        if grep -q "VITE_HUB_MODE=" .env; then
            sed -i "s|^VITE_HUB_MODE=.*|VITE_HUB_MODE=$HUB_MODE|" .env
        else
            echo "VITE_HUB_MODE=$HUB_MODE" >> .env
        fi
        echo -e "${GREEN}✓ Configuración de rol aplicada al .env${NC}"
    fi
else
    echo -e "${YELLOW}⚠ .env ya contiene configuración de rol. Para cambiarlo, ejecuta con RECONFIGURE=true${NC}"
fi

echo ""

# 3. Limpiar contenedores previos si existen
echo -e "${BLUE}[3/7] Limpiando contenedores previos...${NC}"
docker compose down 2>/dev/null || true
echo -e "${GREEN}✓ Contenedores previos limpiados${NC}"
echo ""

# 4. Iniciar PostgreSQL databases
echo -e "${BLUE}[4/7] Iniciando bases de datos PostgreSQL...${NC}"
echo "Esto puede tardar 30-60 segundos..."
docker compose up -d postgres-a76 postgres-keycloak

if wait_for_healthy "postgres-a76" && wait_for_healthy "postgres-keycloak"; then
    echo -e "${GREEN}✓ Bases de datos PostgreSQL iniciadas y saludables${NC}"
else
    echo -e "${RED}✗ Error iniciando bases de datos${NC}"
    exit 1
fi
echo ""

# 5. Iniciar Keycloak
echo -e "${BLUE}[5/7] Iniciando Keycloak...${NC}"
echo "Esto puede tardar 60-90 segundos..."
docker compose up -d keycloak

if wait_for_healthy "keycloak"; then
    echo -e "${GREEN}✓ Keycloak iniciado y saludable${NC}"
else
    echo -e "${RED}✗ Error iniciando Keycloak${NC}"
    exit 1
fi
echo ""

# 6. Iniciar Backend
echo -e "${BLUE}[6/7] Iniciando Backend FastAPI...${NC}"
echo "Esto puede tardar 30-60 segundos..."
docker compose up -d backend

if wait_for_healthy "backend"; then
    echo -e "${GREEN}✓ Backend iniciado y saludable${NC}"
else
    echo -e "${RED}✗ Error iniciando Backend${NC}"
    echo "Verificando logs..."
    docker compose logs --tail=50 backend
    exit 1
fi
echo ""

# 7. Iniciar Frontend
echo -e "${BLUE}[7/7] Iniciando Frontend SvelteKit...${NC}"
echo "Esto puede tardar 30-45 segundos..."
docker compose up -d frontend

if wait_for_healthy "frontend"; then
    echo -e "${GREEN}✓ Frontend iniciado y saludable${NC}"
else
    echo -e "${YELLOW}⚠ Frontend puede estar iniciando, verifica los logs si es necesario${NC}"
fi
echo ""

# Resumen
echo "========================================="
echo -e "${GREEN}   ✓ Instalación Completada${NC}"
echo "========================================="
echo ""
echo "Servicios disponibles:"
echo -e "  ${GREEN}•${NC} Frontend:  ${BLUE}http://localhost:5173${NC}"
echo -e "  ${GREEN}•${NC} Backend:   ${BLUE}http://localhost:8000/api${NC}"
echo -e "  ${GREEN}•${NC} API Docs:  ${BLUE}http://localhost:8000/api/docs${NC}"
echo -e "  ${GREEN}•${NC} Keycloak:  ${BLUE}http://localhost:8080${NC}"
echo ""
echo "Credenciales de Keycloak Admin:"
echo "  • Usuario: admin"
echo "  • Password: admin"
echo ""
echo -e "${YELLOW}⚠ IMPORTANTE:${NC}"
echo "  Debes configurar Keycloak antes de poder usar la aplicación."
echo "  Sigue la guía en: docs/KEYCLOAK_SETUP.md"
echo ""
echo "Usuario de prueba (después de configurar Keycloak):"
echo "  • Usuario: demo"
echo "  • Password: demo123"
echo ""
echo "Comandos útiles:"
echo "  • Ver logs:           docker compose logs -f"
echo "  • Ver logs servicio:  docker compose logs -f [servicio]"
echo "  • Estado servicios:   docker compose ps"
echo "  • Detener todo:       docker compose down"
echo "  • Detener y limpiar:  docker compose down -v"
echo ""
echo -e "${GREEN}¡Disfruta desarrollando con Anexo76!${NC}"
echo ""
