#!/usr/bin/env bash
# =============================================================================
# RecreaHUB API — Deploy Zero-Downtime — CentOS 7 + PM2
#
# Este script faz deploy sem parar o servidor (pm2 reload).
# Execute a partir do diretório da aplicação ou de qualquer lugar.
#
# Uso:
#   bash /opt/recreahub-api/scripts/deploy-centos7.sh
#   bash deploy-centos7.sh [--branch main]
#
# Pré-requisito:
#   - PM2 instalado e aplicação já iniciada
#   - git configurado no servidor
# =============================================================================
set -euo pipefail

APP_DIR="/opt/recreahub-api"
APP_NAME="recreahub-api"
APP_USER="recreahub"
BRANCH="main"
TIMESTAMP=$(date '+%Y-%m-%d %H:%M:%S')

# ── Cores para output ─────────────────────────────────────────────────────────
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
CYAN='\033[0;36m'
NC='\033[0m'

# ── Parse de argumentos ───────────────────────────────────────────────────────
while [[ $# -gt 0 ]]; do
  case "$1" in
    --branch)
      BRANCH="${2:-main}"
      shift 2
      ;;
    *)
      echo -e "${RED}ERRO: Argumento desconhecido: $1${NC}"
      echo "Uso: bash deploy-centos7.sh [--branch main]"
      exit 1
      ;;
  esac
done

echo ""
echo "============================================================"
echo -e "  ${CYAN}RecreaHUB API — Deploy Zero-Downtime${NC}"
echo "  Timestamp : ${TIMESTAMP}"
echo "  Diretório : ${APP_DIR}"
echo "  Branch    : ${BRANCH}"
echo "============================================================"
echo ""

# ── Verificar se o diretório da aplicação existe ──────────────────────────────
if [ ! -d "${APP_DIR}" ]; then
  echo -e "${RED}ERRO: Diretório da aplicação não encontrado: ${APP_DIR}${NC}"
  echo "Execute setup-centos7.sh primeiro."
  exit 1
fi

cd "${APP_DIR}"

# ── 1. Git pull ───────────────────────────────────────────────────────────────
echo "  → [1/4] git pull origin ${BRANCH}..."
git pull origin "${BRANCH}"
GIT_HASH=$(git rev-parse --short HEAD 2>/dev/null || echo "desconhecido")
GIT_MSG=$(git log -1 --pretty=format:"%s" 2>/dev/null || echo "")
echo -e "  ${GREEN}OK${NC}: HEAD → ${GIT_HASH} — ${GIT_MSG}"

# ── 2. Instalar/atualizar dependências de produção ────────────────────────────
echo "  → [2/4] npm install (sem devDependencies)..."
npm install --omit=dev
echo -e "  ${GREEN}OK${NC}: Dependências atualizadas"

# ── 3. Reload zero-downtime com PM2 ──────────────────────────────────────────
echo "  → [3/4] pm2 reload ${APP_NAME} (zero-downtime)..."
# pm2 reload reinicia workers um a um — sem interrupção do serviço
if pm2 list 2>/dev/null | grep -q "${APP_NAME}"; then
  pm2 reload "${APP_NAME}" --update-env
  echo -e "  ${GREEN}OK${NC}: Aplicação recarregada sem downtime"
else
  echo -e "  ${YELLOW}AVISO${NC}: ${APP_NAME} não está na lista do PM2. Iniciando..."
  if [ -f "${APP_DIR}/ecosystem.config.js" ]; then
    pm2 start ecosystem.config.js --env production
  else
    pm2 start server.js --name "${APP_NAME}" --env production
  fi
  echo -e "  ${GREEN}OK${NC}: Aplicação iniciada"
fi

# ── 4. Salvar estado do PM2 ───────────────────────────────────────────────────
echo "  → [4/4] pm2 save..."
pm2 save
echo -e "  ${GREEN}OK${NC}: Lista de processos PM2 salva"

# ── Status final ──────────────────────────────────────────────────────────────
echo ""
echo "============================================================"
echo -e "  ${GREEN}Deploy Concluído!${NC}"
echo "============================================================"
echo "  App       : ${APP_NAME}"
echo "  Commit    : ${GIT_HASH}"
echo "  Branch    : ${BRANCH}"
echo "  Diretório : ${APP_DIR}"
echo "  Início    : ${TIMESTAMP}"
echo "  Fim       : $(date '+%Y-%m-%d %H:%M:%S')"
echo ""
echo "  Status PM2:"

# Mostrar status usando python (disponível no CentOS 7) para parsear JSON
pm2 jlist 2>/dev/null | python -c "
import sys, json
try:
    apps = json.load(sys.stdin)
    for a in apps:
        if a['name'] == '${APP_NAME}':
            status = a['pm2_env']['status']
            restarts = a['pm2_env'].get('restart_time', 0)
            uptime_ms = a['pm2_env'].get('pm_uptime', 0)
            print('  Nome    : ' + a['name'])
            print('  Status  : ' + status)
            print('  Reinícios: ' + str(restarts))
except Exception as e:
    pass
" 2>/dev/null || true

pm2 status "${APP_NAME}" 2>/dev/null || true

echo ""
echo "  Comandos de diagnóstico:"
echo "    pm2 logs ${APP_NAME}          — logs em tempo real"
echo "    journalctl -u ${APP_NAME} -f  — logs systemd"
echo "    pm2 monit                     — monitor visual"
echo "============================================================"
