#!/bin/bash

# Script para verificar si los puertos del servidor están libres
# Uso: ./check-ports.sh

set -e

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

# Función para verificar si un puerto está en uso
check_port() {
    local port=$1
    local service=$2
    
    # Verificar si el puerto está en uso
    if command -v netstat >/dev/null 2>&1; then
        # Usar netstat (más común en Linux)
        if netstat -tuln 2>/dev/null | grep -q ":${port} "; then
            return 1  # Puerto en uso
        fi
    elif command -v ss >/dev/null 2>&1; then
        # Usar ss (más moderno)
        if ss -tuln 2>/dev/null | grep -q ":${port} "; then
            return 1  # Puerto en uso
        fi
    elif command -v lsof >/dev/null 2>&1; then
        # Usar lsof (macOS/BSD)
        if lsof -i :${port} >/dev/null 2>&1; then
            return 1  # Puerto en uso
        fi
    else
        # Intentar con nc (netcat) como último recurso
        if nc -z localhost ${port} 2>/dev/null; then
            return 1  # Puerto en uso
        fi
    fi
    
    return 0  # Puerto libre
}

# Función para obtener información del proceso que usa el puerto
get_port_info() {
    local port=$1
    
    if command -v lsof >/dev/null 2>&1; then
        lsof -i :${port} 2>/dev/null | tail -n +2 | awk '{print $1, $2}' | head -1
    elif command -v ss >/dev/null 2>&1; then
        ss -tulnp 2>/dev/null | grep ":${port} " | awk '{print $6, $7}' | head -1
    elif command -v netstat >/dev/null 2>&1; then
        netstat -tulnp 2>/dev/null | grep ":${port} " | awk '{print $7}' | head -1
    else
        echo "N/A"
    fi
}

# Array de puertos a verificar con sus descripciones
declare -a ports=(
    "5432:PostgreSQL Database"
    "7233:Temporal gRPC"
    "8082:Temporal Web UI"
    "3000:Backend API"
    "5173:Frontend Development"
    "8080:Frontend Production"
    "80:HTTP (Nginx)"
    "443:HTTPS (Nginx SSL)"
)

echo "=========================================="
echo "  Verificación de Puertos del Servidor"
echo "=========================================="
echo ""

# Contadores
total_ports=0
free_ports=0
used_ports=0
ports_in_use=()

# Verificar cada puerto
for port_info in "${ports[@]}"; do
    IFS=':' read -r port service <<< "$port_info"
    total_ports=$((total_ports + 1))
    
    if check_port "$port"; then
        echo -e "${GREEN}✓${NC} Puerto ${port} (${service}): ${GREEN}LIBRE${NC}"
        free_ports=$((free_ports + 1))
    else
        process_info=$(get_port_info "$port")
        echo -e "${RED}✗${NC} Puerto ${port} (${service}): ${RED}EN USO${NC}"
        if [ -n "$process_info" ] && [ "$process_info" != "N/A" ]; then
            echo "    → Proceso: $process_info"
        fi
        used_ports=$((used_ports + 1))
        ports_in_use+=("$port:$service")
    fi
done

echo ""
echo "=========================================="
echo "  Resumen"
echo "=========================================="
echo "Total de puertos verificados: ${total_ports}"
echo -e "Puertos libres: ${GREEN}${free_ports}${NC}"
echo -e "Puertos en uso: ${RED}${used_ports}${NC}"

if [ ${used_ports} -gt 0 ]; then
    echo ""
    echo -e "${YELLOW}⚠ ADVERTENCIA:${NC} Los siguientes puertos están en uso:"
    for port_info in "${ports_in_use[@]}"; do
        IFS=':' read -r port service <<< "$port_info"
        echo "  - Puerto ${port}: ${service}"
    done
    echo ""
    echo "Si estos puertos deben estar libres, puedes:"
    echo "  1. Detener los servicios que los están usando"
    echo "  2. Cambiar la configuración de los puertos en docker-compose.yml"
    echo ""
    exit 1
else
    echo ""
    echo -e "${GREEN}✓ Todos los puertos están libres y listos para usar${NC}"
    echo ""
    exit 0
fi
