#!/bin/bash

# Script de Diagnóstico para Producción - AI Learning Platform
# Este script recopila información del sistema para diagnosticar problemas

echo "=========================================="
echo "DIAGNÓSTICO DE PRODUCCIÓN"
echo "Fecha: $(date)"
echo "=========================================="
echo ""

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

# Función para imprimir secciones
print_section() {
    echo ""
    echo "=========================================="
    echo -e "${GREEN}$1${NC}"
    echo "=========================================="
}

# Función para imprimir errores
print_error() {
    echo -e "${RED}ERROR: $1${NC}"
}

# Función para imprimir advertencias
print_warning() {
    echo -e "${YELLOW}ADVERTENCIA: $1${NC}"
}

# 1. INFORMACIÓN DEL SISTEMA
print_section "1. INFORMACIÓN DEL SISTEMA"
echo "Hostname: $(hostname)"
echo "Sistema Operativo: $(cat /etc/os-release | grep PRETTY_NAME | cut -d '"' -f 2)"
echo "Kernel: $(uname -r)"
echo "Uptime: $(uptime)"
echo ""

# 2. ESTADO DE DOCKER
print_section "2. ESTADO DE DOCKER"
if ! command -v docker &> /dev/null; then
    print_error "Docker no está instalado o no está en el PATH"
else
    echo "Versión de Docker: $(docker --version)"
    echo ""
    echo "Docker Compose versión: $(docker compose version 2>/dev/null || docker-compose --version 2>/dev/null || echo 'No encontrado')"
    echo ""
    
    echo "--- Estado de contenedores Docker ---"
    docker ps -a --format "table {{.Names}}\t{{.Status}}\t{{.Ports}}"
    echo ""
    
    echo "--- Contenedores en ejecución ---"
    RUNNING_CONTAINERS=$(docker ps --format "{{.Names}}")
    if [ -z "$RUNNING_CONTAINERS" ]; then
        print_warning "No hay contenedores en ejecución"
    else
        echo "$RUNNING_CONTAINERS"
    fi
fi
echo ""

# 3. VARIABLES DE ENTORNO Y CONFIGURACIÓN
print_section "3. VARIABLES DE ENTORNO Y CONFIGURACIÓN"

echo "--- Archivo .env principal ---"
if [ -f ".env" ]; then
    echo "✓ .env existe"
    # Mostrar solo las variables importantes (sin valores sensibles)
    echo "Variables configuradas (sin valores sensibles):"
    grep -E "^(NODE_ENV|FRONTEND_URL|BACKEND_URL|API_URL|PORT|VITE_)" .env | sed 's/=.*/=***/' || echo "No se pudieron leer las variables"
else
    print_error ".env no existe"
fi
echo ""

echo "--- Archivo backend/.env ---"
if [ -f "backend/.env" ]; then
    echo "✓ backend/.env existe"
    echo "Variables configuradas (sin valores sensibles):"
    grep -E "^(NODE_ENV|CORS_ORIGIN|PORT|DATABASE_URL|JWT_SECRET)" backend/.env | sed 's/=.*/=***/' || echo "No se pudieron leer las variables"
    echo ""
    echo "CORS_ORIGIN completo:"
    grep "^CORS_ORIGIN" backend/.env || print_warning "CORS_ORIGIN no encontrado"
else
    print_error "backend/.env no existe"
fi
echo ""

echo "--- Archivo frontend/.env (si existe) ---"
if [ -f "frontend/.env" ]; then
    echo "✓ frontend/.env existe"
    cat frontend/.env | grep -v "^#" | grep -v "^$"
else
    print_warning "frontend/.env no existe (puede ser normal en producción)"
fi
echo ""

echo "--- Variables de entorno en contenedor frontend ---"
if docker ps --format "{{.Names}}" | grep -q "frontend"; then
    FRONTEND_CONTAINER=$(docker ps --format "{{.Names}}" | grep frontend | grep -v buscador | head -1)
    echo "Variables VITE_ en el contenedor frontend ($FRONTEND_CONTAINER):"
    docker exec "$FRONTEND_CONTAINER" env 2>/dev/null | grep VITE_ || print_warning "No se encontraron variables VITE_"
else
    print_warning "Contenedor frontend no está en ejecución"
fi
echo ""

# 4. CONFIGURACIÓN DE NGINX
print_section "4. CONFIGURACIÓN DE NGINX"

echo "--- Nginx en contenedor frontend ---"
if docker ps --format "{{.Names}}" | grep -q "frontend"; then
    FRONTEND_CONTAINER=$(docker ps --format "{{.Names}}" | grep frontend | grep -v buscador | head -1)
    echo "Archivo nginx.conf activo en $FRONTEND_CONTAINER:"
    docker exec "$FRONTEND_CONTAINER" cat /etc/nginx/conf.d/default.conf 2>/dev/null || print_error "No se pudo leer nginx.conf"
else
    print_warning "Contenedor frontend no está en ejecución"
fi
echo ""

# 5. ARCHIVOS BUILD DEL FRONTEND
print_section "5. ARCHIVOS BUILD DEL FRONTEND"

echo "--- Verificando index.html construido ---"
if [ -f "frontend/dist/index.html" ]; then
    echo "✓ frontend/dist/index.html existe"
    echo ""
    echo "Contenido relevante (buscando referencias a API):"
    grep -i "localhost\|3000\|api" frontend/dist/index.html || echo "No se encontraron referencias a localhost o API en index.html"
else
    print_warning "frontend/dist/index.html no existe"
fi
echo ""

echo "--- Verificando archivos JS construidos ---"
if [ -d "frontend/dist/assets" ]; then
    echo "Archivos en frontend/dist/assets:"
    ls -lh frontend/dist/assets/*.js 2>/dev/null | head -5
    echo ""
    echo "Buscando 'localhost' en archivos JS (primeros 5 resultados):"
    grep -r "localhost" frontend/dist/assets/*.js 2>/dev/null | head -5 || echo "No se encontró 'localhost' en archivos JS"
else
    print_warning "frontend/dist/assets no existe"
fi
echo ""

# 6. PUERTOS Y CONEXIONES
print_section "6. PUERTOS Y CONEXIONES DE RED"

echo "--- Puertos en escucha ---"
echo "Puerto 80 (HTTP):"
netstat -tlnp 2>/dev/null | grep ":80 " || ss -tlnp 2>/dev/null | grep ":80 " || print_warning "No se pudo verificar puerto 80"
echo ""
echo "Puerto 443 (HTTPS):"
netstat -tlnp 2>/dev/null | grep ":443 " || ss -tlnp 2>/dev/null | grep ":443 " || print_warning "No se pudo verificar puerto 443"
echo ""
echo "Puerto 3000 (Backend API):"
netstat -tlnp 2>/dev/null | grep ":3000 " || ss -tlnp 2>/dev/null | grep ":3000 " || print_warning "No se pudo verificar puerto 3000"
echo ""

echo "--- Test de conectividad local ---"
echo "Test curl a localhost:3000:"
curl -I http://localhost:3000/health 2>&1 | head -5 || print_warning "No se pudo conectar a localhost:3000"
echo ""

# 7. LOGS DE CONTENEDORES
print_section "7. LOGS RECIENTES DE CONTENEDORES"

if docker ps --format "{{.Names}}" | grep -q "backend"; then
    BACKEND_CONTAINER=$(docker ps --format "{{.Names}}" | grep backend | head -1)
    echo "--- Últimas 30 líneas de logs del backend ($BACKEND_CONTAINER) ---"
    docker logs --tail 30 "$BACKEND_CONTAINER" 2>&1
    echo ""
else
    print_warning "Contenedor backend no está en ejecución"
fi

if docker ps --format "{{.Names}}" | grep -q "frontend"; then
    FRONTEND_CONTAINER=$(docker ps --format "{{.Names}}" | grep frontend | grep -v buscador | head -1)
    echo "--- Últimas 30 líneas de logs del frontend ($FRONTEND_CONTAINER) ---"
    docker logs --tail 30 "$FRONTEND_CONTAINER" 2>&1
    echo ""
else
    print_warning "Contenedor frontend no está en ejecución"
fi

# 8. DOCKER COMPOSE
print_section "8. CONFIGURACIÓN DE DOCKER COMPOSE"

if [ -f "docker-compose.yml" ]; then
    echo "✓ docker-compose.yml existe"
    echo ""
    echo "Servicios definidos:"
    grep "^  [a-z]" docker-compose.yml | sed 's/:$//'
    echo ""
    echo "--- Variables de entorno en docker-compose.yml ---"
    grep -A 5 "environment:" docker-compose.yml | head -20
else
    print_error "docker-compose.yml no existe"
fi
echo ""

# 9. VERIFICACIÓN DE CERTIFICADOS SSL
print_section "9. CERTIFICADOS SSL"

if [ -d "ssl" ]; then
    echo "✓ Directorio ssl/ existe"
    echo "Contenido:"
    ls -lh ssl/ 2>/dev/null
    echo ""
    
    # Verificar certificados
    if [ -f "ssl/fullchain.pem" ]; then
        echo "Información del certificado:"
        openssl x509 -in ssl/fullchain.pem -noout -dates -subject 2>/dev/null || print_warning "No se pudo leer el certificado"
    fi
else
    print_warning "Directorio ssl/ no existe"
fi
echo ""

# 10. RESUMEN Y DIAGNÓSTICO
print_section "10. RESUMEN Y DIAGNÓSTICO"

echo "Verificando problemas comunes..."
echo ""

# Verificar si el frontend está usando localhost
if grep -r "localhost:3000" frontend/dist/ 2>/dev/null | grep -q "localhost"; then
    print_error "¡PROBLEMA ENCONTRADO! El frontend está configurado para usar localhost:3000"
    echo "   Esto causará problemas de CORS en producción."
    echo "   Solución: Reconstruir el frontend con las variables de entorno correctas."
    echo ""
fi

# Verificar CORS_ORIGIN
if [ -f "backend/.env" ]; then
    CORS_ORIGIN=$(grep "^CORS_ORIGIN" backend/.env | cut -d '=' -f 2)
    if [ -z "$CORS_ORIGIN" ]; then
        print_error "CORS_ORIGIN no está configurado en backend/.env"
    else
        echo "✓ CORS_ORIGIN configurado: $CORS_ORIGIN"
    fi
fi
echo ""

# Verificar que los contenedores estén corriendo
BACKEND_RUNNING=$(docker ps --format "{{.Names}}" | grep backend | wc -l)
FRONTEND_RUNNING=$(docker ps --format "{{.Names}}" | grep frontend | wc -l)

if [ "$BACKEND_RUNNING" -eq 0 ]; then
    print_error "El contenedor backend NO está en ejecución"
else
    echo "✓ Contenedor backend está en ejecución"
fi

if [ "$FRONTEND_RUNNING" -eq 0 ]; then
    print_error "El contenedor frontend NO está en ejecución"
else
    echo "✓ Contenedor frontend está en ejecución"
fi

echo ""
print_section "FIN DEL DIAGNÓSTICO"
echo "Guarda este output completo para análisis."
echo ""
echo "ACCIONES RECOMENDADAS:"
echo "1. Verificar que VITE_API_BASE_URL esté configurado correctamente"
echo "2. Reconstruir el frontend con las variables de entorno correctas"
echo "3. Verificar CORS_ORIGIN en backend/.env"
echo "4. Reiniciar los contenedores después de corregir la configuración"
echo ""

