#!/bin/bash

################################################################################
#                                                                              #
#  SIGED MILITAR - INSTALAÇÃO AUTOMÁTICA PARA CPANEL                          #
#  Script de instalação totalmente automatizado                               #
#                                                                              #
#  USO:                                                                       #
#  1. Upload este arquivo para public_html                                   #
#  2. Via SSH, execute: bash instalar_automatico.sh                           #
#                                                                              #
#  ⚠️  IMPORTANTE:                                                             #
#  - Edite as variáveis de configuração abaixo ANTES de executar             #
#  - Certifique-se de ter backup dos dados antes                             #
#  - O script pode levar 10-15 minutos                                        #
#                                                                              #
################################################################################

set -e  # Parar em caso de erro

################################################################################
# CONFIGURAÇÕES - EDITE AQUI!
################################################################################

# Nome do banco de dados
DB_NAME="siged_local"

# Usuário do banco
DB_USER="siged_user"

# Senha do banco (gere uma forte!)
DB_PASS="SenhaForte123!@#"

# Nome da aplicação
APP_NAME="SIGED Militar"

# Domínio (deixe em branco se não souber)
APP_URL="https://seu-dominio.com.br"

# Email de admin
ADMIN_EMAIL="admin@siged.local"

# Senha de admin
ADMIN_PASS="password123"

# Limite de memória PHP (em MB)
MEMORY_LIMIT="512"

# Diretório de instalação (normalmente public_html)
INSTALL_DIR="$(pwd)"

# Email para notificações
NOTIFY_EMAIL=""

################################################################################
# CORES PARA OUTPUT
################################################################################

RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
BLUE='\033[0;34m'
MAGENTA='\033[0;35m'
CYAN='\033[0;36m'
NC='\033[0m' # No Color

################################################################################
# LOGGING
################################################################################

LOG_FILE="$INSTALL_DIR/instalacao_$(date +%Y%m%d_%H%M%S).log"

log() {
    echo "[$(date '+%Y-%m-%d %H:%M:%S')] $1" | tee -a "$LOG_FILE"
}

print_header() {
    echo -e "\n${CYAN}════════════════════════════════════════════════════════${NC}"
    echo -e "${CYAN}║ $1${NC}"
    echo -e "${CYAN}════════════════════════════════════════════════════════${NC}\n"
    log ">>> $1"
}

print_success() {
    echo -e "${GREEN}✓${NC} $1"
    log "✓ $1"
}

print_error() {
    echo -e "${RED}✗${NC} $1"
    log "✗ $1"
}

print_warning() {
    echo -e "${YELLOW}⚠${NC} $1"
    log "⚠ $1"
}

print_info() {
    echo -e "${BLUE}ℹ${NC} $1"
    log "ℹ $1"
}

print_step() {
    echo -e "\n${MAGENTA}→${NC} $1"
    log "→ $1"
}

################################################################################
# FUNÇÕES AUXILIARES
################################################################################

# Pausar com mensagem
pause() {
    read -p "Pressione Enter para continuar..." -n1 -s
    echo ""
}

# Verificar se comando existe
command_exists() {
    command -v "$1" >/dev/null 2>&1
}

# Obter versão do programa
get_version() {
    if command_exists "$1"; then
        "$1" --version 2>&1 | head -n 1
    else
        echo "Não instalado"
    fi
}

# Executar comando com timeout
run_with_timeout() {
    local timeout=$1
    shift
    timeout "$timeout" "$@" || {
        local exit_code=$?
        if [ $exit_code -eq 124 ]; then
            print_error "Comando expirou após $timeout segundos"
            return 1
        fi
        return $exit_code
    }
}

################################################################################
# VERIFICAÇÕES INICIAIS
################################################################################

print_header "VERIFICAÇÕES INICIAIS"

print_step "Verificando dependências..."

# Verificar PHP
if command_exists php; then
    PHP_VERSION=$(php --version | head -n 1)
    print_success "PHP encontrado: $PHP_VERSION"
else
    print_error "PHP não encontrado. Instale PHP 8.2+ primeiro"
    exit 1
fi

# Verificar PHP versão
PHP_MAJOR=$(php -r "echo PHP_MAJOR_VERSION;")
PHP_MINOR=$(php -r "echo PHP_MINOR_VERSION;")

if [ "$PHP_MAJOR" -lt 8 ] || ([ "$PHP_MAJOR" -eq 8 ] && [ "$PHP_MINOR" -lt 2 ]); then
    print_error "PHP 8.2+ necessário (você tem $PHP_MAJOR.$PHP_MINOR)"
    exit 1
fi

# Verificar Composer
if ! command_exists composer; then
    print_warning "Composer não encontrado. Instalando..."
    
    curl -sS https://getcomposer.org/installer | php
    sudo mv composer.phar /usr/local/bin/composer
    sudo chmod +x /usr/local/bin/composer
    
    if command_exists composer; then
        print_success "Composer instalado com sucesso"
    else
        print_error "Falha ao instalar Composer"
        exit 1
    fi
fi

print_success "Composer encontrado: $(composer --version)"

# Verificar MySQL
if command_exists mysql; then
    print_success "MySQL CLI encontrado: $(mysql --version)"
else
    print_warning "MySQL CLI não encontrado (será acessado via PDO)"
fi

# Verificar Git (opcional)
if command_exists git; then
    print_success "Git encontrado: $(git --version)"
else
    print_warning "Git não encontrado (opcional)"
fi

print_success "Todas as dependências verificadas"

################################################################################
# EXIBIR CONFIGURAÇÕES
################################################################################

print_header "CONFIGURAÇÕES DE INSTALAÇÃO"

echo -e "${BLUE}┌─ Banco de Dados${NC}"
echo -e "${BLUE}│  Nome: ${NC}$DB_NAME"
echo -e "${BLUE}│  Usuário: ${NC}$DB_USER"
echo -e "${BLUE}│  Host: ${NC}localhost"
echo -e "${BLUE}├─ Aplicação${NC}"
echo -e "${BLUE}│  Nome: ${NC}$APP_NAME"
echo -e "${BLUE}│  URL: ${NC}$APP_URL"
echo -e "${BLUE}│  Email Admin: ${NC}$ADMIN_EMAIL"
echo -e "${BLUE}├─ Sistema${NC}"
echo -e "${BLUE}│  Diretório: ${NC}$INSTALL_DIR"
echo -e "${BLUE}│  Memória PHP: ${NC}${MEMORY_LIMIT}MB"
echo -e "${BLUE}│  Log: ${NC}$LOG_FILE"
echo -e "${BLUE}└─ Resultado${NC}"

echo ""
echo -e "${YELLOW}⚠  Verifique as configurações acima!${NC}"
echo ""

read -p "Deseja continuar com estas configurações? (s/n) " -n 1 -r
echo ""

if [[ ! $REPLY =~ ^[Ss]$ ]]; then
    print_error "Instalação cancelada"
    exit 1
fi

################################################################################
# PASSO 1: LIMPAR CACHES ANTERIORES
################################################################################

print_header "PASSO 1/10: LIMPANDO CACHES ANTERIORES"

print_step "Removendo vendor/ anterior..."
if [ -d "vendor" ]; then
    rm -rf vendor
    print_success "vendor/ removido"
else
    print_info "vendor/ não encontrado"
fi

print_step "Removendo node_modules/ anterior..."
if [ -d "node_modules" ]; then
    rm -rf node_modules
    print_success "node_modules/ removido"
else
    print_info "node_modules/ não encontrado"
fi

print_step "Limpando cache do Laravel..."
rm -f bootstrap/cache/config.php
rm -f bootstrap/cache/routes.php
rm -f bootstrap/cache/services.json
print_success "Caches do Laravel limpos"

################################################################################
# PASSO 2: INSTALAR DEPENDÊNCIAS
################################################################################

print_header "PASSO 2/10: INSTALANDO DEPENDÊNCIAS"

print_step "Instalando dependências Composer (pode levar 3-5 minutos)..."

if composer install --no-dev --optimize-autoloader --no-progress --no-suggest 2>&1 | tee -a "$LOG_FILE"; then
    print_success "Dependências Composer instaladas"
else
    print_error "Falha ao instalar Composer"
    log "Verifique: composer install --no-dev --optimize-autoloader"
    exit 1
fi

################################################################################
# PASSO 3: CRIAR ARQUIVO .ENV
################################################################################

print_header "PASSO 3/10: CONFIGURANDO ARQUIVO .env"

print_step "Criando arquivo .env..."

if [ -f ".env" ]; then
    print_warning "Arquivo .env já existe"
    
    read -p "Deseja sobrescrever? (s/n) " -n 1 -r
    echo ""
    
    if [[ $REPLY =~ ^[Ss]$ ]]; then
        cp .env.example .env
        print_success "Arquivo .env recriado"
    fi
else
    cp .env.example .env
    print_success "Arquivo .env criado a partir de .env.example"
fi

print_step "Configurando variáveis de ambiente..."

# Função para editar .env
set_env_var() {
    local key=$1
    local value=$2
    
    if grep -q "^$key=" .env; then
        # Se existir, substituir
        sed -i "s/^$key=.*/$key=$value/" .env
    else
        # Se não existir, adicionar
        echo "$key=$value" >> .env
    fi
}

# Configurar variáveis
set_env_var "APP_NAME" "\"$APP_NAME\""
set_env_var "APP_ENV" "production"
set_env_var "APP_DEBUG" "false"
set_env_var "APP_URL" "\"$APP_URL\""

set_env_var "DB_CONNECTION" "mysql"
set_env_var "DB_HOST" "localhost"
set_env_var "DB_PORT" "3306"
set_env_var "DB_DATABASE" "$DB_NAME"
set_env_var "DB_USERNAME" "$DB_USER"
set_env_var "DB_PASSWORD" "\"$DB_PASS\""

set_env_var "MAIL_MAILER" "log"

print_success "Arquivo .env configurado"

################################################################################
# PASSO 4: GERAR CHAVE DA APLICAÇÃO
################################################################################

print_header "PASSO 4/10: GERANDO CHAVE DA APLICAÇÃO"

print_step "Executando: php artisan key:generate..."

if php artisan key:generate 2>&1 | tee -a "$LOG_FILE"; then
    print_success "Chave APP_KEY gerada com sucesso"
    
    APP_KEY=$(grep "^APP_KEY=" .env | cut -d= -f2-)
    print_info "APP_KEY: $APP_KEY"
else
    print_error "Falha ao gerar chave"
    exit 1
fi

################################################################################
# PASSO 5: AJUSTAR PERMISSÕES
################################################################################

print_header "PASSO 5/10: AJUSTANDO PERMISSÕES"

print_step "Configurando permissões de pastas..."

chmod -R 755 storage
print_success "storage: 755"

chmod -R 755 bootstrap/cache
print_success "bootstrap/cache: 755"

chmod -R 755 public
print_success "public: 755"

# Se não funcionar com 755, tentar 777
if ! touch storage/.writetest 2>/dev/null; then
    print_warning "Permissão 755 insuficiente, usando 777..."
    chmod -R 777 storage
    chmod -R 777 bootstrap/cache
fi

rm -f storage/.writetest

print_success "Permissões ajustadas"

################################################################################
# PASSO 6: EXECUTAR MIGRATIONS
################################################################################

print_header "PASSO 6/10: EXECUTANDO MIGRATIONS"

print_step "Criando tabelas do banco de dados (pode levar 1-2 minutos)..."

if php -d memory_limit=${MEMORY_LIMIT}M artisan migrate --force 2>&1 | tee -a "$LOG_FILE"; then
    print_success "Migrations executadas com sucesso"
else
    print_error "Falha ao executar migrations"
    log "Verifique: php artisan migrate:status"
    exit 1
fi

################################################################################
# PASSO 7: POPULAR BANCO COM DADOS INICIAIS
################################################################################

print_header "PASSO 7/10: POPULANDO BANCO DE DADOS"

print_step "Executando seeder (PapelPermissaoSeeder)..."

if php artisan db:seed --class=PapelPermissaoSeeder --force 2>&1 | tee -a "$LOG_FILE"; then
    print_success "Banco populado com papéis e permissões"
else
    print_warning "Falha ao executar seeder (pode haver dados anteriores)"
fi

################################################################################
# PASSO 8: CRIAR USUÁRIO ADMIN (OPCIONAL)
################################################################################

print_header "PASSO 8/10: CRIANDO USUÁRIO ADMIN"

print_step "Criando usuário admin..."

php artisan tinker <<EOF 2>&1 | tee -a "$LOG_FILE"
<?php

\$user = \App\Models\Usuario::firstOrCreate(
    ['email' => '$ADMIN_EMAIL'],
    [
        'nome' => 'Administrador',
        'email' => '$ADMIN_EMAIL',
        'password' => Hash::make('$ADMIN_PASS'),
        'email_verified_at' => now(),
        'ativo' => true,
    ]
);

\$user->assignRole('Super Admin');

echo "Usuário admin criado/atualizado com sucesso\n";
?>
EOF

print_success "Usuário admin criado/atualizado"

################################################################################
# PASSO 9: OTIMIZAR APLICAÇÃO
################################################################################

print_header "PASSO 9/10: OTIMIZANDO APLICAÇÃO"

print_step "Gerando cache de configuração..."
php artisan config:cache 2>&1 | tee -a "$LOG_FILE"
print_success "Cache de config gerado"

print_step "Gerando cache de rotas..."
php artisan route:cache 2>&1 | tee -a "$LOG_FILE"
print_success "Cache de rotas gerado"

print_step "Otimizando autoloader..."
composer dump-autoload -o 2>&1 | tee -a "$LOG_FILE"
print_success "Autoloader otimizado"

################################################################################
# PASSO 10: VERIFICAÇÃO FINAL
################################################################################

print_header "PASSO 10/10: VERIFICAÇÃO FINAL"

print_step "Verificando instalação..."

# Verificar arquivo artisan
if [ -f "artisan" ]; then
    print_success "Arquivo artisan encontrado"
else
    print_error "Arquivo artisan não encontrado"
fi

# Verificar pasta vendor
if [ -d "vendor" ]; then
    print_success "Pasta vendor criada"
    VENDOR_SIZE=$(du -sh vendor 2>/dev/null | cut -f1)
    print_info "Tamanho: $VENDOR_SIZE"
else
    print_error "Pasta vendor não criada"
fi

# Verificar arquivo .env
if [ -f ".env" ]; then
    print_success "Arquivo .env existe"
    
    # Verificar se contém variáveis críticas
    for var in "APP_KEY" "DB_DATABASE" "DB_USERNAME"; do
        if grep -q "^$var=" .env; then
            print_success "$var configurado"
        else
            print_warning "$var não encontrado"
        fi
    done
else
    print_error "Arquivo .env não encontrado"
fi

# Verificar arquivo index.php
if [ -f "public/index.php" ]; then
    print_success "Arquivo public/index.php encontrado"
else
    print_error "Arquivo public/index.php não encontrado"
fi

################################################################################
# RESUMO FINAL
################################################################################

print_header "INSTALAÇÃO CONCLUÍDA COM SUCESSO! 🎉"

echo -e "${GREEN}╔════════════════════════════════════════════════════════╗${NC}"
echo -e "${GREEN}║   SIGED MILITAR - INSTALAÇÃO AUTOMÁTICA COMPLETA!    ║${NC}"
echo -e "${GREEN}╚════════════════════════════════════════════════════════╝${NC}"

echo ""
echo -e "${CYAN}📊 Resumo da Instalação:${NC}"
echo ""

echo -e "${BLUE}┌─ Banco de Dados${NC}"
echo -e "${BLUE}│  ✓ Migrations executadas${NC}"
echo -e "${BLUE}│  ✓ Tabelas criadas${NC}"
echo -e "${BLUE}│  ✓ Dados iniciais populados${NC}"
echo -e "${BLUE}├─ Aplicação${NC}"
echo -e "${BLUE}│  ✓ Dependências instaladas${NC}"
echo -e "${BLUE}│  ✓ Arquivo .env configurado${NC}"
echo -e "${BLUE}│  ✓ APP_KEY gerada${NC}"
echo -e "${BLUE}│  ✓ Usuário admin criado${NC}"
echo -e "${BLUE}├─ Otimizações${NC}"
echo -e "${BLUE}│  ✓ Cache de config${NC}"
echo -e "${BLUE}│  ✓ Cache de rotas${NC}"
echo -e "${BLUE}│  ✓ Autoloader otimizado${NC}"
echo -e "${BLUE}├─ Sistema${NC}"
echo -e "${BLUE}│  ✓ Permissões ajustadas${NC}"
echo -e "${BLUE}│  ✓ Log de instalação: $LOG_FILE${NC}"
echo -e "${BLUE}└─ Credenciais de Acesso${NC}"
echo -e "${BLUE}   Email: $ADMIN_EMAIL${NC}"
echo -e "${BLUE}   Senha: $ADMIN_PASS${NC}"

echo ""
echo -e "${CYAN}🌐 Próximas Etapas:${NC}"
echo ""
echo "1. Acesse: $APP_URL"
echo "2. Login com:"
echo "   Email: $ADMIN_EMAIL"
echo "   Senha: $ADMIN_PASS"
echo ""
echo "3. Mude a senha de admin (IMPORTANTE!)"
echo ""
echo "4. Configure dados da instituição"
echo ""
echo "5. Leia documentação:"
echo "   - README_MASTER.md"
echo "   - CHECKLIST_PRODUCAO.md"
echo ""

echo -e "${CYAN}📋 Informações Importantes:${NC}"
echo ""
echo "- APP_KEY: $APP_KEY"
echo "- DB_DATABASE: $DB_NAME"
echo "- DB_USERNAME: $DB_USER"
echo "- APP_ENV: production"
echo "- APP_DEBUG: false"
echo ""

echo -e "${YELLOW}⚠️  SEGURANÇA:${NC}"
echo ""
echo "[ ] Alterar senha admin no sistema"
echo "[ ] Alterar senha do banco de dados"
echo "[ ] Configurar backups automáticos"
echo "[ ] Ativar HTTPS/SSL"
echo "[ ] Configurar firewalls"
echo ""

echo -e "${CYAN}📞 Suporte:${NC}"
echo ""
echo "Se encontrar problemas:"
echo "1. Verifique: $LOG_FILE"
echo "2. Leia: TROUBLESHOOTING_CPANEL.md"
echo "3. Contacte sua hospedagem"
echo ""

################################################################################
# ENVIAR EMAIL (OPCIONAL)
################################################################################

if [ -n "$NOTIFY_EMAIL" ]; then
    print_step "Enviando notificação por email..."
    
    if command_exists mail; then
        echo "Instalação do SIGED concluída em $(hostname)" | \
            mail -s "SIGED Instalado com Sucesso" "$NOTIFY_EMAIL"
        
        print_success "Email enviado para: $NOTIFY_EMAIL"
    else
        print_warning "Comando mail não disponível"
    fi
fi

################################################################################
# FIM
################################################################################

print_success "Instalação finalizada em $(date '+%Y-%m-%d %H:%M:%S')"
print_info "Log salvo em: $LOG_FILE"

echo ""
echo -e "${GREEN}✓ Obrigado por usar SIGED Militar! 🚀${NC}"
echo ""

exit 0
