#!/usr/bin/env bash
# ============================================================
# update-all.sh — Actualizar todos los clientes CXP (Docker)
# ============================================================
# Uso: sudo bash update-all.sh [imagen]
# Ej:  sudo bash update-all.sh                   ← usa cxp-app:latest
#      sudo bash update-all.sh cxp-app:v1.2.0    ← tag específico
#      sudo bash update-all.sh registry.io/cxp:3  ← desde registry
# ============================================================
set -euo pipefail

GREEN='\033[0;32m'; YELLOW='\033[1;33m'; CYAN='\033[0;36m'
RED='\033[0;31m'; NC='\033[0m'

IMAGE="${1:-cxp-app:latest}"
WEB_ROOT="/var/www/html"
SCRIPT_DIR="$(cd "$(dirname "$0")" && pwd)"

# Descubrir clientes
CLIENTS=()
for f in "$WEB_ROOT"/*/mbcxp/docker-compose.yml; do
    [ -f "$f" ] && CLIENTS+=("$(basename "$(dirname "$(dirname "$f")")")")
done

[ ${#CLIENTS[@]} -eq 0 ] && { echo "No hay clientes CXP"; exit 0; }

echo ""
echo "╔══════════════════════════════════════════════════╗"
echo "║      CXP — Actualización Docker                  ║"
echo "╠══════════════════════════════════════════════════╣"
printf "║  Imagen:   %-38s ║\n" "$IMAGE"
printf "║  Clientes: %-38s ║\n" "${#CLIENTS[@]} (${CLIENTS[*]})"
echo "╚══════════════════════════════════════════════════╝"
echo ""
read -p "¿Continuar? (s/N): " C; [ "$C" = "s" ] || [ "$C" = "S" ] || exit 0

# 1. Pull/tag imagen
echo -e "\n━━━ ${CYAN}[1/3]${NC} Preparando imagen ━━━"
if echo "$IMAGE" | grep -q '/'; then
    echo "  Haciendo docker pull $IMAGE..."
    docker pull "$IMAGE"
else
    docker image inspect "$IMAGE" &>/dev/null || {
        echo -e "${RED}Imagen $IMAGE no encontrada. Build o pull primero.${NC}"; exit 1; }
fi

# Guardar versión anterior para rollback
docker tag cxp-app:latest cxp-app:previous 2>/dev/null || true
echo -e "  ${GREEN}✅ Imagen lista${NC}"

# 2. Backup
echo -e "\n━━━ ${CYAN}[2/3]${NC} Backups ━━━"
for CLIENT in "${CLIENTS[@]}"; do
    BACKUP_SCRIPT="$SCRIPT_DIR/backup-client.sh"
    [ -x "$BACKUP_SCRIPT" ] && bash "$BACKUP_SCRIPT" "$CLIENT" 2>&1 | tail -1 || true
done

# 3. Recrear contenedores
echo -e "\n━━━ ${CYAN}[3/3]${NC} Actualizando contenedores ━━━"
ERRORS=0
for CLIENT in "${CLIENTS[@]}"; do
    DIR="$WEB_ROOT/$CLIENT/mbcxp"
    echo -e "\n  → ${CYAN}$CLIENT${NC}"

    cd "$DIR"

    # Actualizar imagen en .env si es diferente
    if [ "$IMAGE" != "cxp-app:latest" ]; then
        sed -i "s|^CXP_IMAGE=.*|CXP_IMAGE=$IMAGE|" .env
    fi

    docker compose up -d --force-recreate 2>&1 | tail -3
    sleep 8

    PORT=$(grep 'CLIENT_PORT=' .env | cut -d= -f2)
    HTTP=$(curl -s -o /dev/null -w "%{http_code}" --max-time 10 \
        "http://127.0.0.1:${PORT}/health" 2>/dev/null || echo "000")

    if [ "$HTTP" = "200" ]; then
        echo -e "    ${GREEN}✅ OK${NC}"
    else
        echo -e "    ${YELLOW}⚠  HTTP $HTTP${NC}"
        ERRORS=$((ERRORS + 1))
    fi
done

echo ""
echo "══════════════════════════════════════════"
[ $ERRORS -eq 0 ] && echo -e "${GREEN}✅ Todos actualizados${NC}" \
                   || echo -e "${YELLOW}⚠  $ERRORS con advertencias${NC}"

echo ""
echo "Rollback de un cliente:"
echo "  cd /var/www/html/<nombre>/mbcxp"
echo "  sed -i 's|CXP_IMAGE=.*|CXP_IMAGE=cxp-app:previous|' .env"
echo "  docker compose up -d --force-recreate"

docker image prune -f 2>/dev/null || true
