#!/bin/bash
# ================================================================
# DEPLOY SCRIPT — Sistema de Gestión
# ================================================================
# Uso:  bash deploy.sh
#   o:  bash deploy.sh "mensaje del commit"
#
# Qué hace:
#   1. Commit + push a GitLab  →  cPanel auto-deploya el backend
#   2. Build del frontend
#   3. Crea dist.zip en el Escritorio listo para subir a cPanel
# ================================================================

set -e

# ── Configuración ───────────────────────────────────────────────
PROYECTO="$(cd "$(dirname "$0")" && pwd)"
FRONTEND="$PROYECTO/frontend"
BACKEND="$PROYECTO/backend"
ZIP_DESTINO="$HOME/Desktop/dist.zip"
PROD_URL="https://sistema.websiteprocl.com"
CPANEL_URL="https://websiteprocl.com:2083"

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

log()  { echo -e "${CYAN}▶${NC} $1"; }
ok()   { echo -e "${GREEN}✓${NC} $1"; }
warn() { echo -e "${YELLOW}⚠${NC}  $1"; }
err()  { echo -e "${RED}✗${NC} $1"; exit 1; }
sep()  { echo -e "\n${BOLD}━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━${NC}"; }

sep
echo -e "${BOLD}  DEPLOY — Sistema de Gestión${NC}"
echo -e "  Producción: ${CYAN}${PROD_URL}${NC}"
sep

cd "$PROYECTO"

# ── Verificar que estamos en el branch correcto ─────────────────
BRANCH=$(git rev-parse --abbrev-ref HEAD)
if [ "$BRANCH" != "master" ] && [ "$BRANCH" != "main" ]; then
  warn "Estás en branch '${BRANCH}', no en master/main."
  read -p "   ¿Continuar de todas formas? (s/N): " CONT
  [[ "$CONT" =~ ^[Ss]$ ]] || { echo "Abortado."; exit 0; }
fi

# ── 1. Git: commit + push ───────────────────────────────────────
echo ""
log "1/3  Git: commit y push a GitLab..."

git add \
  backend/api/ \
  backend/config/ \
  backend/helpers/ \
  backend/middleware/ \
  backend/services/ \
  backend/.htaccess \
  backend/index.php \
  database/ \
  frontend/src/ \
  frontend/public/ \
  frontend/index.html \
  frontend/package.json \
  frontend/package-lock.json \
  frontend/vite.config.js \
  frontend/tailwind.config.js \
  frontend/.env.production \
  frontend/.env.example \
  .gitignore \
  .cpanel.yml \
  README.md 2>/dev/null || true

CAMBIOS=$(git status --short | grep -v "^?" | wc -l | tr -d ' ')

if [ "$CAMBIOS" -eq "0" ]; then
  warn "No hay cambios para commitear."
else
  echo ""
  git status --short | grep -v "^?" | head -20
  echo ""

  if [ -n "$1" ]; then
    MSG="$1"
  else
    read -p "   Mensaje del commit: " MSG
    [ -z "$MSG" ] && MSG="deploy: actualización $(date '+%Y-%m-%d %H:%M')"
  fi

  git commit -m "$MSG"
  ok "Commit creado: ${MSG}"
fi

echo ""
log "   Push a GitLab..."
git push origin "$BRANCH"
ok "GitLab actualizado → cPanel desplegará el backend automáticamente"

# ── 2. Build frontend ───────────────────────────────────────────
echo ""
log "2/3  Build del frontend (producción)..."

# Verificar .env.production
if [ ! -f "$FRONTEND/.env.production" ]; then
  err ".env.production no encontrado en frontend/. Crea el archivo con VITE_API_URL."
fi

API_URL=$(grep "VITE_API_URL" "$FRONTEND/.env.production" | cut -d= -f2)
echo "     VITE_API_URL → ${API_URL}"

cd "$FRONTEND"
npm run build

ok "Build generado en frontend/dist/"

# ── 3. Crear zip ────────────────────────────────────────────────
echo ""
log "3/3  Creando dist.zip..."

rm -f "$ZIP_DESTINO"
cd "$FRONTEND/dist"
zip -r "$ZIP_DESTINO" . -x "*.DS_Store" -x "__MACOSX/*"

TAMAÑO=$(du -sh "$ZIP_DESTINO" | cut -f1)
ok "Zip creado: ${ZIP_DESTINO} (${TAMAÑO})"

# ── Instrucciones finales ────────────────────────────────────────
sep
echo ""
echo -e "${BOLD}  PRÓXIMOS PASOS EN EL SERVIDOR${NC}"
echo ""
echo -e "${BOLD}  BACKEND${NC} (se despliega automático vía GitLab → cPanel Git)"
echo "  Verifica en: ${CPANEL_URL} → Git™ Version Control"
echo ""
echo -e "${BOLD}  FRONTEND${NC} (manual):"
echo ""
echo "  1. Abre cPanel File Manager: ${CPANEL_URL}"
echo "  2. Navega a la carpeta del dominio"
echo "     (ej: public_html/sistema.websiteprocl.com/)"
echo "  3. Sube dist.zip desde tu Escritorio"
echo "  4. Click derecho → Extraer → OK"
echo "  5. Borra dist.zip del servidor"
echo ""
echo -e "${BOLD}  BASE DE DATOS${NC} (solo si hay migraciones nuevas):"
echo ""

# Detectar migraciones no aplicadas (archivos nuevos en database/)
MIGRACIONES=$(git diff --name-only HEAD~1 HEAD 2>/dev/null | grep "^database/" || true)
if [ -n "$MIGRACIONES" ]; then
  warn "Migraciones pendientes detectadas — ejecutar en MySQL de producción:"
  for m in $MIGRACIONES; do
    echo "     → $m"
  done
else
  echo "  Sin migraciones nuevas en este deploy."
fi

echo ""
echo -e "${BOLD}  VERIFICACIÓN:${NC}"
echo "  → ${PROD_URL}  (debe cargar el login)"
echo "  → ${PROD_URL}/backend/health  (health check del API)"
echo ""
sep

# Abrir Finder para facilitar subida
open "$HOME/Desktop" 2>/dev/null || true
