#!/bin/bash

################################################################################
# MEGACUBO v2.0 - Script de Instalação Profissional para cPanel
# Autor: Manus AI
# Data: 2026-03-31
# Descrição: Instala Node.js, pnpm, dependências e configura PM2
################################################################################

set -e  # Sair em caso de erro

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

# Variáveis
MEGACUBO_USER="megacubo"
MEGACUBO_HOME="/home/megacubo"
MEGACUBO_DIR="$MEGACUBO_HOME/public_html"
NODE_VERSION="20.11.0"
LOG_FILE="/tmp/megacubo-install.log"

################################################################################
# Funções Auxiliares
################################################################################

log_info() {
    echo -e "${BLUE}[INFO]${NC} $1" | tee -a "$LOG_FILE"
}

log_success() {
    echo -e "${GREEN}[✓]${NC} $1" | tee -a "$LOG_FILE"
}

log_error() {
    echo -e "${RED}[✗]${NC} $1" | tee -a "$LOG_FILE"
}

log_warning() {
    echo -e "${YELLOW}[!]${NC} $1" | tee -a "$LOG_FILE"
}

################################################################################
# Verificações Iniciais
################################################################################

log_info "Iniciando instalação do MEGACUBO v2.0..."
log_info "Diretório: $MEGACUBO_DIR"
log_info "Usuário: $MEGACUBO_USER"

# Verificar se está rodando como root
if [ "$EUID" -ne 0 ]; then
   log_error "Este script deve ser executado como root (use sudo)"
   exit 1
fi

# Verificar se o diretório existe
if [ ! -d "$MEGACUBO_DIR" ]; then
    log_error "Diretório $MEGACUBO_DIR não encontrado!"
    exit 1
fi

log_success "Diretório do projeto encontrado"

################################################################################
# 1. Instalar Node.js via nvm (Node Version Manager)
################################################################################

log_info "Fase 1: Instalando Node.js..."

# Verificar se Node.js já está instalado
if command -v node &> /dev/null; then
    NODE_INSTALLED=$(node -v)
    log_warning "Node.js já instalado: $NODE_INSTALLED"
else
    log_info "Instalando Node.js versão $NODE_VERSION..."
    
    # Instalar nvm
    curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.39.0/install.sh | bash
    
    # Carregar nvm
    export NVM_DIR="$HOME/.nvm"
    [ -s "$NVM_DIR/nvm.sh" ] && \. "$NVM_DIR/nvm.sh"
    
    # Instalar Node.js
    nvm install $NODE_VERSION
    nvm use $NODE_VERSION
    nvm alias default $NODE_VERSION
    
    log_success "Node.js $NODE_VERSION instalado com sucesso"
fi

# Verificar versão
NODE_VERSION_INSTALLED=$(node -v)
NPM_VERSION_INSTALLED=$(npm -v)
log_success "Node.js: $NODE_VERSION_INSTALLED"
log_success "npm: $NPM_VERSION_INSTALLED"

################################################################################
# 2. Instalar pnpm
################################################################################

log_info "Fase 2: Instalando pnpm..."

if command -v pnpm &> /dev/null; then
    PNPM_VERSION=$(pnpm -v)
    log_warning "pnpm já instalado: $PNPM_VERSION"
else
    npm install -g pnpm
    log_success "pnpm instalado com sucesso"
fi

PNPM_VERSION=$(pnpm -v)
log_success "pnpm: $PNPM_VERSION"

################################################################################
# 3. Instalar dependências do projeto
################################################################################

log_info "Fase 3: Instalando dependências do projeto..."

cd "$MEGACUBO_DIR"

# Limpar cache se necessário
log_info "Limpando cache do pnpm..."
pnpm store prune || true

# Instalar dependências
log_info "Executando: pnpm install"
pnpm install --frozen-lockfile || pnpm install

log_success "Dependências instaladas com sucesso"

################################################################################
# 4. Compilar o projeto
################################################################################

log_info "Fase 4: Compilando o projeto..."

log_info "Executando: pnpm build"
pnpm build

log_success "Projeto compilado com sucesso"

################################################################################
# 5. Verificar arquivos compilados
################################################################################

log_info "Fase 5: Verificando arquivos compilados..."

if [ -f "$MEGACUBO_DIR/dist/index.js" ]; then
    log_success "Arquivo de entrada encontrado: dist/index.js"
else
    log_error "Arquivo dist/index.js não encontrado!"
    exit 1
fi

if [ -d "$MEGACUBO_DIR/client/dist" ]; then
    log_success "Frontend compilado encontrado: client/dist"
else
    log_warning "Frontend compilado não encontrado em client/dist"
fi

################################################################################
# 6. Instalar PM2 globalmente
################################################################################

log_info "Fase 6: Instalando PM2..."

npm install -g pm2

log_success "PM2 instalado com sucesso"

################################################################################
# 7. Configurar PM2
################################################################################

log_info "Fase 7: Configurando PM2..."

# Criar arquivo de configuração do PM2
cat > "$MEGACUBO_DIR/ecosystem.config.js" << 'EOF'
module.exports = {
  apps: [{
    name: 'megacubo',
    script: './dist/index.js',
    instances: 'max',
    exec_mode: 'cluster',
    env: {
      NODE_ENV: 'production',
      PORT: 3000
    },
    error_file: '/tmp/megacubo-error.log',
    out_file: '/tmp/megacubo-out.log',
    log_date_format: 'YYYY-MM-DD HH:mm:ss Z',
    merge_logs: true,
    autorestart: true,
    max_memory_restart: '1G',
    watch: false,
    ignore_watch: ['node_modules', 'dist', 'client/dist'],
    max_restarts: 10,
    min_uptime: '10s'
  }]
};
EOF

log_success "Arquivo ecosystem.config.js criado"

# Parar aplicação anterior se existir
pm2 delete megacubo || true

# Iniciar aplicação com PM2
cd "$MEGACUBO_DIR"
pm2 start ecosystem.config.js

# Salvar configuração do PM2
pm2 save

# Configurar PM2 para iniciar no boot
pm2 startup systemd -u $MEGACUBO_USER --hp $MEGACUBO_HOME

log_success "PM2 configurado com sucesso"

################################################################################
# 8. Exibir status
################################################################################

log_info "Fase 8: Verificando status..."

pm2 status
pm2 logs megacubo --lines 20

################################################################################
# 9. Informações finais
################################################################################

log_success "✓ Instalação concluída com sucesso!"
log_info ""
log_info "========== INFORMAÇÕES IMPORTANTES =========="
log_info "Diretório: $MEGACUBO_DIR"
log_info "Arquivo de entrada: dist/index.js"
log_info "Porta: 3000"
log_info "Gerenciador: PM2"
log_info "Aplicação: megacubo"
log_info ""
log_info "Comandos úteis:"
log_info "  pm2 status              - Ver status da aplicação"
log_info "  pm2 logs megacubo       - Ver logs em tempo real"
log_info "  pm2 restart megacubo    - Reiniciar aplicação"
log_info "  pm2 stop megacubo       - Parar aplicação"
log_info "  pm2 start megacubo      - Iniciar aplicação"
log_info ""
log_info "Próximos passos:"
log_info "1. Configurar proxy reverso no cPanel (Apache/Nginx)"
log_info "2. Configurar variáveis de ambiente (.env)"
log_info "3. Configurar banco de dados MySQL"
log_info "4. Apontar domínio megacubo.com.br"
log_info "==========================================="
log_info ""
log_info "Log completo: $LOG_FILE"

exit 0
