#!/bin/bash

################################################################################
# MEGACUBO v2.0 - Script de Instalação para cPanel (Usuário)
# Executa sem necessidade de sudo
# Uso: bash install-megacubo-user.sh
################################################################################

set -e

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

# Variáveis
MEGACUBO_DIR="/home/megacubo/public_html"
LOG_FILE="/tmp/megacubo-install-$(date +%s).log"

# Funções
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"; }

echo -e "${BLUE}========================================${NC}"
echo -e "${BLUE}🚀 MEGACUBO v2.0 - Instalação${NC}"
echo -e "${BLUE}========================================${NC}"
echo ""

# 1. Verificações
log_info "Verificando ambiente..."

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

log_success "Diretório encontrado: $MEGACUBO_DIR"

# 2. Verificar Node.js
log_info "Verificando Node.js..."

if ! command -v node &> /dev/null; then
    log_error "Node.js não está instalado!"
    log_info "Solicite ao administrador do cPanel para instalar Node.js"
    log_info "Ou use: nvm install 20.11.0"
    exit 1
fi

NODE_VERSION=$(node -v)
log_success "Node.js encontrado: $NODE_VERSION"

# 3. Verificar npm
log_info "Verificando npm..."

if ! command -v npm &> /dev/null; then
    log_error "npm não está instalado!"
    exit 1
fi

NPM_VERSION=$(npm -v)
log_success "npm encontrado: $NPM_VERSION"

# 4. Instalar pnpm (local)
log_info "Instalando pnpm..."

if ! command -v pnpm &> /dev/null; then
    log_info "pnpm não encontrado, instalando..."
    npm install -g pnpm --prefix ~/.npm-global 2>/dev/null || npm install -g pnpm
    
    # Adicionar ao PATH se necessário
    if ! command -v pnpm &> /dev/null; then
        export PATH="$HOME/.npm-global/bin:$PATH"
    fi
fi

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

# 5. Navegar para o diretório
log_info "Navegando para o diretório do projeto..."
cd "$MEGACUBO_DIR"
log_success "Diretório atual: $(pwd)"

# 6. Instalar dependências
log_info "Instalando dependências do projeto..."
log_info "Isso pode levar alguns minutos..."

if [ -f "pnpm-lock.yaml" ]; then
    pnpm install --frozen-lockfile 2>/dev/null || pnpm install
else
    pnpm install
fi

log_success "Dependências instaladas com sucesso"

# 7. Compilar projeto
log_info "Compilando projeto para produção..."
log_info "Isso pode levar alguns minutos..."

pnpm build

if [ ! -f "dist/index.js" ]; then
    log_error "Compilação falhou! Arquivo dist/index.js não encontrado"
    exit 1
fi

log_success "Projeto compilado com sucesso"

# 8. Verificar estrutura
log_info "Verificando estrutura de arquivos..."

if [ -d "dist" ]; then
    log_success "Backend compilado: dist/"
fi

if [ -d "client/dist" ]; then
    log_success "Frontend compilado: client/dist/"
fi

# 9. Instalar PM2 (global)
log_info "Instalando PM2..."

if ! command -v pm2 &> /dev/null; then
    npm install -g pm2
fi

log_success "PM2 instalado: $(pm2 -v)"

# 10. Criar ecosystem.config.js
log_info "Criando configuração do PM2..."

cat > "$MEGACUBO_DIR/ecosystem.config.js" << 'EOF'
module.exports = {
  apps: [{
    name: 'megacubo',
    script: './dist/index.js',
    instances: 1,
    exec_mode: 'fork',
    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: '500M',
    watch: false,
    ignore_watch: ['node_modules', 'dist', 'client/dist'],
    max_restarts: 10,
    min_uptime: '10s'
  }]
};
EOF

log_success "Configuração do PM2 criada"

# 11. Parar aplicação anterior
log_info "Parando aplicação anterior (se existir)..."
pm2 delete megacubo 2>/dev/null || true

# 12. Iniciar aplicação
log_info "Iniciando aplicação com PM2..."
pm2 start "$MEGACUBO_DIR/ecosystem.config.js"

# 13. Salvar configuração
pm2 save 2>/dev/null || true

# 14. Exibir status
log_info "Status da aplicação:"
pm2 status

# 15. Exibir logs
log_info "Últimas linhas de log:"
pm2 logs megacubo --lines 20

echo ""
echo -e "${GREEN}========================================${NC}"
echo -e "${GREEN}✨ Instalação concluída com sucesso!${NC}"
echo -e "${GREEN}========================================${NC}"
echo ""
echo "📋 Próximos passos:"
echo ""
echo "1️⃣  Configurar variáveis de ambiente:"
echo "    nano $MEGACUBO_DIR/.env"
echo ""
echo "2️⃣  Criar banco de dados MySQL:"
echo "    mysql -u root -p"
echo "    CREATE DATABASE megacubo_db;"
echo "    CREATE USER 'megacubo_user'@'localhost' IDENTIFIED BY 'senha';"
echo "    GRANT ALL PRIVILEGES ON megacubo_db.* TO 'megacubo_user'@'localhost';"
echo ""
echo "3️⃣  Executar migrations:"
echo "    cd $MEGACUBO_DIR"
echo "    pnpm prisma migrate deploy"
echo ""
echo "4️⃣  Reiniciar aplicação:"
echo "    pm2 restart megacubo"
echo ""
echo "5️⃣  Configurar domínio no cPanel:"
echo "    Ferramentas → Setup Node.js App"
echo ""
echo "📊 Comandos úteis:"
echo "    pm2 status              - Ver status"
echo "    pm2 logs megacubo       - Ver logs"
echo "    pm2 restart megacubo    - Reiniciar"
echo "    pm2 stop megacubo       - Parar"
echo "    pm2 start megacubo      - Iniciar"
echo ""
echo "📝 Log completo: $LOG_FILE"
echo ""

exit 0
