#!/bin/bash

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

printf "%b\n" "${CYAN}====================================================${NC}"
printf "%b\n" "${CYAN}  Lanzador Optimizado - Manager Campaign Balancer   ${NC}"
printf "%b\n" "${CYAN}====================================================${NC}"

# Cargar variables de entorno desde .env.prod si existe
if [ -f .env.prod ]; then
    printf "%b\n" "${GREEN}ℹ️ Cargando variables desde .env.prod...${NC}"
    # Exportar variables sin comentarios ni líneas en blanco
    export $(grep -v '^#' .env.prod | xargs)
else
    printf "%b\n" "${RED}❌ Error: No se encontró el archivo .env.prod en la raíz.${NC}"
    exit 1
fi

# Buscar cualquier archivo .jar en la carpeta raíz
JAR_PATH=$(ls *.jar 2>/dev/null | head -n 1)

# Verificar si el archivo JAR existe
if [ -z "$JAR_PATH" ] || [ ! -f "$JAR_PATH" ]; then
    printf "%b\n" "${RED}❌ Error: No se encontró ningún archivo .jar en este directorio.${NC}"
    printf "%b\n" "${YELLOW}💡 Asegúrate de colocar el archivo .jar compilado aquí.${NC}"
    exit 1
fi

# Parámetros de límites de recursos para JVM
# -Xms64m: Memoria inicial del heap reducida
# -Xmx256m: Memoria máxima del heap limitada a 256MB
# -XX:MaxMetaspaceSize=128m: Limita el espacio de metadatos de clases a 128MB
# -XX:+UseSerialGC: Usa el recolector de basura serial (bajo overhead de memoria, ideal para pocos recursos)
# -Xss256k: Hilos ligeros con pila de 256KB en lugar de 1MB por hilo
# -XX:TieredStopAtLevel=1: Optimiza el tiempo de inicio (JIT limitado al nivel 1) para un inicio ultra rápido
JVM_OPTS="-Xms64m -Xmx256m -XX:MaxMetaspaceSize=128m -XX:+UseSerialGC -Xss256k -XX:TieredStopAtLevel=1"

printf "\n%b\n" "${GREEN}🚀 Iniciando Manager Campaign Balancer con limitaciones de recursos JVM:${NC}"
printf "   • Memoria Inicial Heap (-Xms): %b\n" "${CYAN}64 MB${NC}"
printf "   • Memoria Máxima Heap (-Xmx):  %b\n" "${CYAN}256 MB${NC}"
printf "   • Metaspace Máximo:            %b\n" "${CYAN}128 MB${NC}"
printf "   • Garbage Collector:          %b\n" "${CYAN}Serial GC (Bajo consumo)${NC}"
printf "   • Hilos (-Xss):                %b\n" "${CYAN}256 KB por hilo${NC}"
printf "   • Optimización de Inicio:      %b\n" "${CYAN}Tiered Compilation (Nivel 1)${NC}"
printf "%b\n" "${CYAN}----------------------------------------------------${NC}"

# Archivos de log y PID
LOG_FILE="microservice-manager-campaign-caja.log"
PID_FILE="microservice-manager-campaign-caja.pid"

# Detener instancia previa si existe
if [ -f "$PID_FILE" ]; then
    OLD_PID=$(cat "$PID_FILE")
    if kill -0 "$OLD_PID" 2>/dev/null; then
        printf "%b\n" "${YELLOW}⚠️  Se encontró una instancia previa (PID: $OLD_PID). Deteniéndola...${NC}"
        kill "$OLD_PID"
        sleep 2
    fi
    rm -f "$PID_FILE"
fi

# Ejecutar la aplicación en segundo plano con nohup
nohup java $JVM_OPTS -jar "$JAR_PATH" > "$LOG_FILE" 2>&1 &
APP_PID=$!
echo "$APP_PID" > "$PID_FILE"

printf "\n%b\n" "${GREEN}✅ Manager Campaign Balancer lanzado en segundo plano (PID: $APP_PID)${NC}"
printf "%b\n" "   • Log:  ${CYAN}$LOG_FILE${NC}"
printf "%b\n" "   • PID:  ${CYAN}$PID_FILE${NC}"
printf "%b\n" "${YELLOW}💡 Para detenerlo: kill \$(cat $PID_FILE)  o  kill $APP_PID${NC}"
printf "%b\n" "${CYAN}----------------------------------------------------${NC}"
printf "%b\n" "${CYAN}📋 Mostrando log en tiempo real (Ctrl+C no detiene el servicio):${NC}"
printf "%b\n" "${CYAN}----------------------------------------------------${NC}"

# Mostrar los logs en tiempo real; Ctrl+C solo sale del tail, no del servicio
tail -f "$LOG_FILE"
