#!/usr/bin/env bash
# =============================================================================
# RecreaHUB API — Setup CentOS 7
#
# AVISO DE COMPATIBILIDADE:
#   Node.js 18 LTS é o máximo suportado pelo CentOS 7 (glibc 2.17).
#   Node.js 20+ requer glibc 2.28+ e NÃO executa em CentOS 7.
#   Para ambientes novos, migre para Rocky Linux 8/9 ou RHEL 8/9.
#
# Uso:
#   sudo bash setup-centos7.sh
#
# Este script é idempotente — seguro de re-executar.
# =============================================================================
set -euo pipefail

DEPLOY_DIR="/opt/recreahub-api"
APP_PORT=3000
APP_USER="recreahub"

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

echo ""
echo "============================================================"
echo "  RecreaHUB API — Setup CentOS 7"
echo "  Node.js 18 LTS (máximo compatível com glibc 2.17)"
echo "============================================================"
echo ""

# ── 0. Verificar sistema operacional ─────────────────────────────────────────
echo "[0/17] Verificando sistema operacional..."
if [ ! -f /etc/centos-release ]; then
  echo -e "${RED}ERRO: Este script é específico para CentOS 7.${NC}"
  echo "      /etc/centos-release não encontrado."
  echo "      Para Ubuntu/Debian, use setup-linux.sh"
  exit 1
fi

CENTOS_VERSION=$(cat /etc/centos-release)
if ! grep -q "CentOS Linux release 7" /etc/centos-release; then
  echo -e "${RED}ERRO: Requer CentOS 7. Detectado: ${CENTOS_VERSION}${NC}"
  echo "      Para CentOS 8+ ou Rocky Linux, Node.js 20 está disponível."
  exit 1
fi
echo -e "  ${GREEN}OK${NC}: ${CENTOS_VERSION}"

# ── 1. Verificar execução como root ──────────────────────────────────────────
echo "[1/17] Verificando permissões..."
if [ "$EUID" -ne 0 ]; then
  echo -e "${RED}ERRO: Execute como root: sudo bash setup-centos7.sh${NC}"
  exit 1
fi
echo -e "  ${GREEN}OK${NC}: Executando como root"

# ── 2. Atualizar yum e instalar dependências base ─────────────────────────────
echo "[2/17] Instalando curl, wget e git..."
yum install -y curl wget git
echo -e "  ${GREEN}OK${NC}: curl, wget, git instalados"

# ── 3. Instalar Node.js 18 LTS via NodeSource RPM ────────────────────────────
echo ""
echo "[3/17] Configurando repositório NodeSource para Node.js 18 LTS..."
echo -e "  ${YELLOW}NOTA:${NC} Node.js 20+ NÃO é compatível com CentOS 7 (glibc 2.17 < 2.28)"
echo "        Usando Node.js 18 LTS — suporte estendido via NodeSource."

# Verificar se Node.js 18 já está instalado
if command -v node &>/dev/null; then
  NODE_MAJOR=$(node -e "process.stdout.write(process.version.split('.')[0].replace('v',''))")
  if [ "$NODE_MAJOR" -eq 18 ]; then
    echo -e "  ${GREEN}OK${NC}: Node.js 18 já instalado ($(node -v)) — pulando instalação"
  else
    echo -e "  ${YELLOW}AVISO${NC}: Node.js versão diferente detectada ($(node -v)). Instalando v18..."
    curl -fsSL https://rpm.nodesource.com/setup_18.x | bash -
    yum install -y nodejs
  fi
else
  curl -fsSL https://rpm.nodesource.com/setup_18.x | bash -
  yum install -y nodejs
fi

# ── 4. Verificar versões ──────────────────────────────────────────────────────
echo "[4/17] Verificando versões instaladas..."
node -v
npm -v
echo -e "  ${GREEN}OK${NC}: Node.js $(node -v) | npm $(npm -v)"

# ── 5. Instalar PM2 globalmente ───────────────────────────────────────────────
echo "[5/17] Instalando PM2 globalmente..."
if command -v pm2 &>/dev/null; then
  echo -e "  ${GREEN}OK${NC}: PM2 já instalado ($(pm2 -v)) — pulando"
else
  npm install -g pm2
  echo -e "  ${GREEN}OK${NC}: PM2 $(pm2 -v) instalado"
fi

# ── 6. Fazer deploy dos arquivos da aplicação ─────────────────────────────────
echo "[6/17] Fazendo deploy para ${DEPLOY_DIR}..."
mkdir -p "${DEPLOY_DIR}"

# Copiar arquivos do diretório atual (exceto node_modules e .git)
if [ -f "./package.json" ]; then
  rsync -a --exclude='node_modules' --exclude='.git' --exclude='*.log' . "${DEPLOY_DIR}/"
  echo -e "  ${GREEN}OK${NC}: Arquivos copiados para ${DEPLOY_DIR}"
else
  echo -e "  ${YELLOW}AVISO${NC}: package.json não encontrado no diretório atual."
  echo "        Execute este script a partir da raiz do projeto."
  echo "        Continuando — ${DEPLOY_DIR} já pode conter os arquivos."
fi

# ── 7. Instalar dependências de produção ──────────────────────────────────────
echo "[7/17] Instalando dependências de produção..."
cd "${DEPLOY_DIR}"
npm install --omit=dev
echo -e "  ${GREEN}OK${NC}: Dependências instaladas (sem devDependencies)"

# ── 8. Criar usuário do sistema recreahub ─────────────────────────────────────
echo "[8/17] Criando usuário do sistema '${APP_USER}'..."
if id "${APP_USER}" &>/dev/null; then
  echo -e "  ${GREEN}OK${NC}: Usuário '${APP_USER}' já existe — pulando"
else
  useradd -r -s /sbin/nologin -d "${DEPLOY_DIR}" -c "RecreaHUB API Service" "${APP_USER}"
  echo -e "  ${GREEN}OK${NC}: Usuário '${APP_USER}' criado (sistema, sem login)"
fi

# ── 9. Ajustar permissões ─────────────────────────────────────────────────────
echo "[9/17] Ajustando permissões de ${DEPLOY_DIR}..."
chown -R "${APP_USER}:${APP_USER}" "${DEPLOY_DIR}"
chmod -R 750 "${DEPLOY_DIR}"
echo -e "  ${GREEN}OK${NC}: Permissões definidas para ${APP_USER}:${APP_USER}"

# ── 10. Configurar arquivo .env ───────────────────────────────────────────────
echo "[10/17] Configurando arquivo .env..."
if [ ! -f "${DEPLOY_DIR}/.env" ]; then
  if [ -f "${DEPLOY_DIR}/.env.example" ]; then
    cp "${DEPLOY_DIR}/.env.example" "${DEPLOY_DIR}/.env"
    chown "${APP_USER}:${APP_USER}" "${DEPLOY_DIR}/.env"
    chmod 640 "${DEPLOY_DIR}/.env"
    echo -e "  ${YELLOW}ATENÇÃO${NC}: .env criado a partir do .env.example"
    echo "           Edite ${DEPLOY_DIR}/.env antes de iniciar a aplicação!"
  else
    echo -e "  ${YELLOW}AVISO${NC}: .env.example não encontrado. Crie ${DEPLOY_DIR}/.env manualmente."
  fi
else
  echo -e "  ${GREEN}OK${NC}: .env já existe — mantendo configuração atual"
fi

# ── 11. Iniciar aplicação com PM2 ─────────────────────────────────────────────
echo "[11/17] Iniciando RecreaHUB API com PM2..."
cd "${DEPLOY_DIR}"

# Executar PM2 como usuário recreahub
if su -s /bin/bash -c "pm2 list" "${APP_USER}" 2>/dev/null | grep -q "recreahub-api"; then
  echo -e "  ${GREEN}OK${NC}: PM2 já gerencia recreahub-api — recarregando..."
  su -s /bin/bash -c "pm2 reload recreahub-api --update-env" "${APP_USER}"
else
  if [ -f "${DEPLOY_DIR}/ecosystem.config.js" ]; then
    su -s /bin/bash -c "cd ${DEPLOY_DIR} && pm2 start ecosystem.config.js --env production" "${APP_USER}"
  else
    echo -e "  ${YELLOW}AVISO${NC}: ecosystem.config.js não encontrado. Iniciando via server.js..."
    su -s /bin/bash -c "cd ${DEPLOY_DIR} && pm2 start server.js --name recreahub-api --env production" "${APP_USER}"
  fi
fi
echo -e "  ${GREEN}OK${NC}: Aplicação iniciada via PM2"

# ── 12. Salvar lista de processos PM2 ─────────────────────────────────────────
echo "[12/17] Salvando lista de processos PM2..."
su -s /bin/bash -c "pm2 save" "${APP_USER}"
echo -e "  ${GREEN}OK${NC}: Lista de processos PM2 salva"

# ── 13. Configurar PM2 para iniciar no boot (systemd) ────────────────────────
echo "[13/17] Configurando PM2 para auto-start via systemd..."
# pm2 startup retorna o comando que deve ser executado como root
STARTUP_CMD=$(su -s /bin/bash -c "pm2 startup systemd -u ${APP_USER} --hp ${DEPLOY_DIR}" "${APP_USER}" 2>&1 | grep "sudo" | tail -1 || true)
if [ -n "${STARTUP_CMD}" ]; then
  echo "  Executando: ${STARTUP_CMD}"
  eval "${STARTUP_CMD}"
  echo -e "  ${GREEN}OK${NC}: PM2 startup configurado via systemd"
else
  # Tentar diretamente como root
  env PATH="$PATH:/usr/bin" pm2 startup systemd -u "${APP_USER}" --hp "${DEPLOY_DIR}"
  echo -e "  ${GREEN}OK${NC}: PM2 startup systemd configurado"
fi

# ── 14. Configurar firewalld ──────────────────────────────────────────────────
echo "[14/17] Configurando firewalld..."
if systemctl is-active --quiet firewalld; then
  firewall-cmd --permanent --add-service=http
  firewall-cmd --permanent --add-service=https
  firewall-cmd --permanent --add-port="${APP_PORT}/tcp"
  firewall-cmd --reload
  echo -e "  ${GREEN}OK${NC}: Portas 80, 443 e ${APP_PORT} abertas no firewalld"
else
  echo -e "  ${YELLOW}AVISO${NC}: firewalld não está ativo. Iniciando..."
  systemctl start firewalld
  systemctl enable firewalld
  firewall-cmd --permanent --add-service=http
  firewall-cmd --permanent --add-service=https
  firewall-cmd --permanent --add-port="${APP_PORT}/tcp"
  firewall-cmd --reload
  echo -e "  ${GREEN}OK${NC}: firewalld iniciado e portas abertas"
fi

# ── 15. Configurar SELinux ────────────────────────────────────────────────────
echo "[15/17] Configurando SELinux..."
if command -v getenforce &>/dev/null; then
  SELINUX_STATUS=$(getenforce)
  echo "  SELinux status: ${SELINUX_STATUS}"
  if [ "${SELINUX_STATUS}" != "Disabled" ]; then
    # Permitir que o Nginx conecte à rede (necessário para proxy reverso)
    setsebool -P httpd_can_network_connect 1
    echo -e "  ${GREEN}OK${NC}: SELinux httpd_can_network_connect=1 (necessário para Nginx proxy)"
  else
    echo -e "  ${YELLOW}INFO${NC}: SELinux desabilitado — nenhuma configuração necessária"
  fi
else
  echo -e "  ${YELLOW}INFO${NC}: SELinux não disponível neste sistema"
fi

# ── 16. Verificar status final ────────────────────────────────────────────────
echo "[16/17] Verificando status da aplicação..."
su -s /bin/bash -c "pm2 status recreahub-api" "${APP_USER}" 2>/dev/null || pm2 status recreahub-api || true

# ── 17. Resumo final ──────────────────────────────────────────────────────────
echo "[17/17] Setup concluído!"
SERVER_IP=$(hostname -I | awk '{print $1}' 2>/dev/null || echo "api.recreahub.com.br")

echo ""
echo "============================================================"
echo -e "  ${GREEN}RecreaHUB API — Setup CentOS 7 Concluído!${NC}"
echo "============================================================"
echo ""
echo "  Aplicação : http://${SERVER_IP}:${APP_PORT}"
echo "  Health    : http://${SERVER_IP}:${APP_PORT}/health"
echo "  Deploy dir: ${DEPLOY_DIR}"
echo "  Usuário   : ${APP_USER}"
echo ""
echo -e "  ${YELLOW}PRÓXIMOS PASSOS:${NC}"
echo "  1. Edite o arquivo de configuração:"
echo "       nano ${DEPLOY_DIR}/.env"
echo "     Configure: DB_HOST, DB_PASS, JWT_SECRET, etc."
echo ""
echo "  2. Instale o Nginx (proxy reverso):"
echo "       bash scripts/setup-nginx-centos7.sh"
echo ""
echo "  3. Para habilitar HTTPS/SSL:"
echo "       bash scripts/setup-nginx-centos7.sh --ssl api.recreahub.com.br"
echo ""
echo "  Comandos úteis:"
echo "    pm2 status                          — status dos processos"
echo "    pm2 logs recreahub-api              — logs em tempo real"
echo "    pm2 reload recreahub-api --update-env  — reload zero-downtime"
echo "    journalctl -u recreahub-api -f      — logs systemd"
echo "    systemctl status recreahub-api      — status do serviço systemd"
echo "============================================================"
echo ""
echo -e "  ${YELLOW}NOTA DE COMPATIBILIDADE:${NC}"
echo "  Este servidor usa Node.js 18 LTS (CentOS 7, glibc 2.17)."
echo "  Node.js 20+ requer glibc 2.28+ — NÃO compatível com CentOS 7."
echo "  Considere migrar para Rocky Linux 8/9 para usar versões mais novas."
echo "============================================================"
