#!/usr/bin/env bash
# ==============================================================================
# IoPlay Suite - Script de Instalación y Despliegue en Producción NATIVA (Bare-Metal)
# Servidor: 192.95.10.208 | Sin Docker | Linux (Ubuntu / Debian / RHEL)
# ==============================================================================

set -euo pipefail

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

echo -e "${CYAN}${BOLD}"
echo "=============================================================================="
echo "    IoPlay Suite - Instalador de Producción Nativa (Sin Docker)              "
echo "    Servidor Objetivo: 192.95.10.208 | Puerto Web: 5540                       "
echo "=============================================================================="
echo -e "${NC}"

# 1. Verificar Privilegios de Root
if [ "$EUID" -ne 0 ]; then
    echo -e "${RED}[ERROR] Este script debe ejecutarse con privilegios de root (sudo).${NC}"
    echo "Ejecuta: sudo bash scripts/deploy_production_native.sh"
    exit 1
fi

# 2. Detectar Directorio Base del Proyecto
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
BASE_DIR="$(cd "${SCRIPT_DIR}/.." && pwd)"

echo -e "${BLUE}[1/8] Directorio del proyecto detectado:${NC} ${BOLD}${BASE_DIR}${NC}"

# 3. Instalación de Paquetes Necesarios (Solo si faltan, sin alterar el resto del servidor)
echo -e "${BLUE}[2/8] Verificando paquetes del sistema...${NC}"
if command -v apt-get &>/dev/null; then
    export DEBIAN_FRONTEND=noninteractive
    PKGS_TO_INSTALL=()
    for pkg in php-cli php-fpm php-curl php-sqlite3 php-mbstring php-xml php-zip php-bcmath python3 python3-pip python3-venv python3-dev nginx curl unzip sqlite3; do
        if ! dpkg -s "$pkg" &>/dev/null; then
            PKGS_TO_INSTALL+=("$pkg")
        fi
    done

    if [ ${#PKGS_TO_INSTALL[@]} -gt 0 ]; then
        echo -e "${YELLOW}• Instalando paquetes faltantes:${NC} ${PKGS_TO_INSTALL[*]}"
        apt-get update -y
        apt-get install -y "${PKGS_TO_INSTALL[@]}"
    else
        echo -e "${GREEN}✓ Todos los paquetes requeridos ya están instalados.${NC}"
    fi
fi

# 4. Configurar Variables de Entorno (.env)
echo -e "${BLUE}[3/8] Verificando archivos de configuración .env...${NC}"

if [ ! -f "${BASE_DIR}/.env" ]; then
    if [ -f "${BASE_DIR}/.env.baremetal.prod.example" ]; then
        cp "${BASE_DIR}/.env.baremetal.prod.example" "${BASE_DIR}/.env"
        echo -e "${GREEN}✓ Creado ${BASE_DIR}/.env desde plantilla bare-metal.${NC}"
    fi
fi

# Ajustar rutas en .env al directorio real del servidor
if [ -f "${BASE_DIR}/.env" ]; then
    sed -i "s|/var/www/ioplay-suite|${BASE_DIR}|g" "${BASE_DIR}/.env"
fi

cp "${BASE_DIR}/.env" "${BASE_DIR}/ioplay-customers/.env"
cp "${BASE_DIR}/.env" "${BASE_DIR}/ioplay-dcm/.env"
cp "${BASE_DIR}/.env" "${BASE_DIR}/ioplay-acs/.env"
echo -e "${GREEN}✓ Archivos .env sincronizados con ${BASE_DIR}.${NC}"

# 5. Configurar Entorno Virtual Python para IoPlay DCM
echo -e "${BLUE}[4/8] Configurando entorno virtual Python para IoPlay DCM (Puerto 4000)...${NC}"
cd "${BASE_DIR}/ioplay-dcm"
if [ ! -d "venv" ]; then
    python3 -m venv venv
fi
"${BASE_DIR}/ioplay-dcm/venv/bin/pip" install --upgrade pip
"${BASE_DIR}/ioplay-dcm/venv/bin/pip" install -r requirements.txt
mkdir -p "${BASE_DIR}/ioplay-dcm/data"
echo -e "${GREEN}✓ Entorno Python de IoPlay DCM listo.${NC}"

# 6. Configurar Entorno Virtual Python para IoPlay ACS
echo -e "${BLUE}[5/8] Configurando entorno virtual Python para IoPlay ACS (Puerto 5000)...${NC}"
cd "${BASE_DIR}/ioplay-acs"
if [ ! -d "venv" ]; then
    python3 -m venv venv
fi
"${BASE_DIR}/ioplay-acs/venv/bin/pip" install --upgrade pip
"${BASE_DIR}/ioplay-acs/venv/bin/pip" install -r requirements.txt
echo -e "${GREEN}✓ Entorno Python de IoPlay ACS listo.${NC}"

# 7. Ajustar Permisos de Carpetas y Bases de Datos SQLite
echo -e "${BLUE}[6/8] Configurando permisos del sistema de archivos...${NC}"
mkdir -p "${BASE_DIR}/ioplay-customers/data"
chown -R www-data:www-data "${BASE_DIR}"
chmod -R 775 "${BASE_DIR}/ioplay-customers/data"
chmod -R 775 "${BASE_DIR}/ioplay-dcm/data"

# 8. Instalar y Habilitar Servicios Systemd
echo -e "${BLUE}[7/8] Instalando y activando servicios en Systemd...${NC}"

# A. Servicio IoPlay DCM
sed -e "s|/var/www/ioplay-suite|${BASE_DIR}|g" \
    "${BASE_DIR}/scripts/systemd/ioplay-dcm.service" > /etc/systemd/system/ioplay-dcm.service

# B. Servicio IoPlay ACS
sed -e "s|/var/www/ioplay-suite|${BASE_DIR}|g" \
    "${BASE_DIR}/scripts/systemd/ioplay-acs.service" > /etc/systemd/system/ioplay-acs.service

systemctl daemon-reload
systemctl enable ioplay-dcm.service
systemctl restart ioplay-dcm.service
systemctl enable ioplay-acs.service
systemctl restart ioplay-acs.service

echo -e "${GREEN}✓ Servicios ioplay-dcm y ioplay-acs iniciados en Systemd.${NC}"

# 9. Configurar Nginx y PHP-FPM
echo -e "${BLUE}[8/8] Configurando Nginx y PHP-FPM...${NC}"

# Iniciar servicio PHP-FPM si está instalado
if systemctl list-unit-files | grep -q 'php.*fpm'; then
    PHP_SVC=$(systemctl list-unit-files | grep -o 'php[0-9.]*-fpm\.service' | head -n 1)
    if [ -n "$PHP_SVC" ]; then
        echo -e "${BLUE}• Activando servicio PHP-FPM:${NC} ${PHP_SVC}"
        systemctl enable "$PHP_SVC"
        systemctl restart "$PHP_SVC"
    fi
fi

# Detectar socket de PHP-FPM activo (PHP 8.4, 8.3, 8.2, 8.1, etc.)
PHP_SOCK=""
for sock in /run/php/php8.4-fpm.sock /run/php/php8.3-fpm.sock /run/php/php8.2-fpm.sock /run/php/php8.1-fpm.sock /run/php/php-fpm.sock /var/run/php/php8.4-fpm.sock /var/run/php/php8.3-fpm.sock /var/run/php-fpm/www.sock /run/php/*.sock; do
    if [ -S "$sock" ]; then
        PHP_SOCK="$sock"
        echo -e "${GREEN}✓ Socket PHP-FPM detectado:${NC} ${PHP_SOCK}"
        break
    fi
done

# Generar configuración Nginx en /etc/nginx/conf.d/
mkdir -p /etc/nginx/conf.d
NGINX_CONF_DEST="/etc/nginx/conf.d/ioplay-customers.conf"

sed -e "s|/var/www/ioplay-suite|${BASE_DIR}|g" \
    "${BASE_DIR}/scripts/nginx/ioplay-customers.conf" > "$NGINX_CONF_DEST"

# Ajustar socket PHP si se detectó uno específico
if [ -n "$PHP_SOCK" ]; then
    sed -i "s|fastcgi_pass unix:/run/php/php-fpm.sock;|fastcgi_pass unix:${PHP_SOCK};|g" "$NGINX_CONF_DEST"
fi

# Eliminar cualquier enlace sobrante en sites-enabled para evitar conflictos fuera de http
rm -f /etc/nginx/sites-enabled/ioplay-customers.conf

# Verificar sintaxis y recargar Nginx
nginx -t
systemctl enable nginx
systemctl restart nginx

echo -e "${GREEN}✓ Nginx configurado y recargado con éxito.${NC}"

# 10. Pruebas de Diagnóstico y Salud en Localhost
echo ""
echo -e "${YELLOW}${BOLD}==============================================================================${NC}"
echo -e "${YELLOW}${BOLD}                     VERIFICACIÓN DE SALUD DE SERVICIOS                       ${NC}"
echo -e "${YELLOW}${BOLD}==============================================================================${NC}"

sleep 2

# Test DCM (Puerto 5541)
echo -n "• Microservicio DCM (127.0.0.1:5541): "
DCM_CODE=$(curl -s -o /dev/null -w "%{http_code}" http://127.0.0.1:5541/api/indexer/status || echo "000")
if [ "$DCM_CODE" = "200" ]; then
    echo -e "${GREEN}OK (HTTP 200 - Indexador y Watcher Activos)${NC}"
else
    echo -e "${RED}FALLÓ (HTTP $DCM_CODE)${NC}"
fi

# Test ACS (Puerto 5542)
echo -n "• Microservicio ACS (127.0.0.1:5542): "
ACS_CODE=$(curl -s -o /dev/null -w "%{http_code}" http://127.0.0.1:5542/api/status || echo "000")
if [ "$ACS_CODE" = "200" ]; then
    echo -e "${GREEN}OK (HTTP 200 - Módulo TR-069 Activo)${NC}"
else
    echo -e "${RED}FALLÓ (HTTP $ACS_CODE)${NC}"
fi

# Test Nginx Web Portal (Puerto 5540)
echo -n "• Portal Web Nginx (127.0.0.1:5540): "
WEB_CODE=$(curl -s -o /dev/null -w "%{http_code}" http://127.0.0.1:5540/login || echo "000")
if [ "$WEB_CODE" = "200" ]; then
    echo -e "${GREEN}OK (HTTP 200 - Portal Listo)${NC}"
else
    echo -e "${RED}FALLÓ (HTTP $WEB_CODE)${NC}"
fi

echo ""
echo -e "${GREEN}${BOLD}==============================================================================${NC}"
echo -e "${GREEN}${BOLD}             ¡DESPLIEGUE NATIVO COMPLETADO SATISFACTORIAMENTE!                ${NC}"
echo -e "${GREEN}${BOLD}==============================================================================${NC}"
echo -e "• Portal Web Público:      ${CYAN}http://192.95.10.208:5540/login${NC}"
echo -e "• Panel de Administración: ${CYAN}http://192.95.10.208:5540/admin${NC}"
echo -e "• Microservicio DCM:       ${YELLOW}http://127.0.0.1:5541${NC}"
echo -e "• Microservicio ACS:       ${YELLOW}http://127.0.0.1:5542${NC}"
echo -e "• Logs Nginx:              ${YELLOW}/var/log/nginx/ioplay_customers_error.log${NC}"
echo "=============================================================================="
