#!/usr/bin/env bash
set -e

echo "🚀 Inicializando servidor CalDAV/CardDAV con Radicale + InfCloud"
echo "================================================================"

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

# Función para mostrar mensajes
info() { echo -e "${BLUE}ℹ️  $1${NC}"; }
success() { echo -e "${GREEN}✅ $1${NC}"; }
warning() { echo -e "${YELLOW}⚠️  $1${NC}"; }
error() { echo -e "${RED}❌ $1${NC}"; }

# Verificar dependencias
info "Verificando dependencias..."

# Verificar Docker
if ! command -v docker >/dev/null 2>&1; then
    error "Docker no encontrado. Instálalo primero: https://docs.docker.com/get-docker/"
    exit 1
fi

# Verificar Docker Compose
if ! docker compose version >/dev/null 2>&1; then
    error "Docker Compose no encontrado o no funciona"
    exit 1
fi

# Verificar htpasswd
if ! command -v htpasswd >/dev/null 2>&1; then
    warning "htpasswd no encontrado. Instalando apache2-utils..."
    if command -v apt >/dev/null 2>&1; then
        sudo apt update && sudo apt install -y apache2-utils
    elif command -v yum >/dev/null 2>&1; then
        sudo yum install -y httpd-tools
    elif command -v pacman >/dev/null 2>&1; then
        sudo pacman -S apache-tools
    else
        error "No se pudo instalar htpasswd automáticamente"
        echo "Instala manualmente: apache2-utils (Ubuntu/Debian) o httpd-tools (RHEL/CentOS)"
        exit 1
    fi
fi

success "Dependencias verificadas"

# 1. Crear estructura de directorios
info "Creando estructura de directorios..."
mkdir -p data config infcloud_config
success "Directorios creados"

# 2. Copiar configuración de Radicale
info "Configurando Radicale..."
if [ ! -f "config/config" ]; then
    cp config_example/config config/config
    success "Configuración de Radicale creada"
else
    warning "Ya existe config/config, no se sobrescribirá"
fi

# 3. Copiar configuración de InfCloud
info "Configurando InfCloud..."
if [ ! -f "infcloud_config/config.js" ]; then
    cp infcloud_config_example/config.js infcloud_config/config.js
    success "Configuración de InfCloud creada"
else
    warning "Ya existe infcloud_config/config.js, no se sobrescribirá"
fi

# 4. Crear archivo de usuarios vacío
if [ ! -f "config/users" ]; then
    touch config/users
    success "Archivo de usuarios creado"
else
    warning "Ya existe config/users"
fi

# 5. Crear usuario administrador
info "Configurando usuario administrador..."
read -p "¿Quieres crear un usuario admin ahora? (s/n): " create_admin
if [[ "$create_admin" =~ ^[sS]$ ]]; then
    htpasswd -B config/users admin
    success "Usuario admin creado"
else
    info "Puedes crear el usuario admin más tarde con: ./create_admin.sh"
fi

# 6. Verificar y parar servicios existentes si están corriendo
info "Verificando servicios existentes..."
if docker ps --format 'table {{.Names}}' | grep -E 'radicale|infcloud' >/dev/null 2>&1; then
    warning "Servicios ya corriendo. Reiniciando..."
    docker compose down
fi

# 7. Levantar servicios
info "Levantando servicios..."
docker compose up -d

# Esperar a que los servicios se inicien
info "Esperando a que los servicios se inicien..."
sleep 5

# 8. Verificar que los servicios están corriendo
info "Verificando servicios..."

# Verificar contenedores
if docker ps --format 'table {{.Names}}\t{{.Status}}' | grep -E 'radicale|infcloud' | grep -q 'Up'; then
    success "Contenedores corriendo correctamente"
else
    error "Problema con los contenedores"
    docker ps --format 'table {{.Names}}\t{{.Status}}' | grep -E 'radicale|infcloud'
    exit 1
fi

# 9. Verificar conectividad
info "Verificando conectividad..."

# Verificar Radicale
if curl -s -f http://localhost:5232/ >/dev/null 2>&1; then
    success "Radicale responde en http://localhost:5232"
else
    error "Radicale no responde"
    echo "Logs de Radicale:"
    docker logs radicale --tail 10
fi

# Verificar InfCloud
if curl -s -f http://localhost:8090/ >/dev/null 2>&1; then
    success "InfCloud responde en http://localhost:8090"
else
    warning "InfCloud puede estar iniciándose aún..."
    echo "Logs de InfCloud:"
    docker logs infcloud --tail 10
fi

echo ""
echo "🎉 ¡Inicialización completada!"
echo "============================================="
echo ""
echo "📱 Servicios disponibles:"
echo "   • Radicale (servidor): http://localhost:5232"
echo "   • InfCloud (cliente web): http://localhost:8090"
echo ""
echo "🔑 Credenciales:"
if [[ "$create_admin" =~ ^[sS]$ ]]; then
    echo "   • Usuario: admin"
    echo "   • Contraseña: (la que configuraste)"
else
    echo "   • Ejecuta: ./create_admin.sh para crear usuario admin"
fi
echo ""
echo "📚 Gestión:"
echo "   • Usuarios: ./radicale_users.sh"
echo "   • Parar: docker compose down"
echo "   • Reiniciar: docker compose restart"
echo ""
echo "🧪 Prueba de conexión:"
echo "   • Abre http://localhost:8090 en tu navegador"
echo "   • Usa las credenciales configuradas"
echo ""

# Mostrar estado final
info "Estado actual de los servicios:"
docker ps --format 'table {{.Names}}\t{{.Image}}\t{{.Status}}\t{{.Ports}}' | grep -E 'NAMES|radicale|infcloud'

echo ""
success "Setup completado exitosamente 🚀"