#!/usr/bin/env bash
# build.sh
# Crea/redirecciona red externa dinámica y levanta el entorno con docker compose
# Uso recomendado: ./build.sh [up|down|restart|build]

set -euo pipefail          # Mejora: -u (variables no definidas = error), -o pipefail (fallo en pipes)
IFS=$'\n\t'                # Seguridad extra contra palabras con espacios

# Colores para mejor legibilidad (opcional pero muy útil)
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
NC='\033[0m' # No Color

# ──────────────────────────────────────────────────────────────────────────────
# 1. Cargar variables de entorno
# ──────────────────────────────────────────────────────────────────────────────
ENV_FILE=".env"

if [[ -f "$ENV_FILE" ]]; then
    echo -e "${GREEN}→ Cargando variables desde ${ENV_FILE}${NC}"
    # Mejor que export $(grep ...) → evita problemas con espacios y comentarios
    set -a
    source "$ENV_FILE"
    set +a
else
    echo -e "${YELLOW}⚠  No se encontró ${ENV_FILE} – se usará entorno por defecto${NC}"
fi

# ──────────────────────────────────────────────────────────────────────────────
# 2. Validar variable crítica
# ──────────────────────────────────────────────────────────────────────────────
: "${NODE_ENV:?Error: La variable NODE_ENV no está definida.  
Ejemplo: export NODE_ENV=development o NODE_ENV=production}"

# Normalizar valores comunes
case "$NODE_ENV" in
    dev|development)  NODE_ENV="development" ;;
    prod|production)  NODE_ENV="production"  ;;
    test|qa)     NODE_ENV="$NODE_ENV"   ;;
    *) echo -e "${RED}✖ Entorno no reconocido: $NODE_ENV${NC}"
       exit 1 ;;
esac

# ──────────────────────────────────────────────────────────────────────────────
# 3. Definir nombre de red (recomendación: más corto y predecible)
# ──────────────────────────────────────────────────────────────────────────────
RAW_PROJECT_DIR_NAME=$(basename "$PWD")
export PROJECT_DIR_NAME=$(echo "$RAW_PROJECT_DIR_NAME" | tr '[:upper:]' '[:lower:]' | tr '.' '-')
PROJECT_NAME="${PROJECT_DIR_NAME}-${NODE_ENV}"
NETWORK_NAME="${PROJECT_DIR_NAME}-net-${NODE_ENV}"

# ──────────────────────────────────────────────────────────────────────────────
# 4. Crear/redirigir red externa si no existe
# ──────────────────────────────────────────────────────────────────────────────
if ! docker network ls --format '{{.Name}}' | grep -q "^${NETWORK_NAME}$"; then
    echo -e "${GREEN}→ Creando red externa: ${NETWORK_NAME}${NC}"
    docker network create --attachable "${NETWORK_NAME}" || {
        echo -e "${RED}✖ Falló al crear la red${NC}"
        exit 1
    }
else
    echo -e "${YELLOW}→ Red ${NETWORK_NAME} ya existe${NC}"
fi

# ──────────────────────────────────────────────────────────────────────────────

# 5. Docker Compose - con mejor manejo de argumentos
# ──────────────────────────────────────────────────────────────────────────────
echo -e "${GREEN}→ Levantando proyecto: ${PROJECT_NAME}${NC}"
echo "   Entorno:     ${NODE_ENV}"
echo "   Red externa: ${NETWORK_NAME}"
echo

# Si quieres permitir parámetros adicionales (up -d, down, etc.)
if [[ $# -eq 0 ]]; then
    # Comportamiento por defecto
    docker compose \
        -p "$PROJECT_NAME" \
        --env-file "$ENV_FILE" \
        up -d --build --remove-orphans
else
    # Permite pasar cualquier comando: ./build.sh down -v
    docker compose \
        -p "$PROJECT_NAME" \
        --env-file "$ENV_FILE" \
        "$@"
fi

echo -e "\n${GREEN}✓ Operación finalizada${NC}"