#!/bin/bash

# Script de Deploy Automático - WayGest Gestão
# Uso: ./deploy.sh [ambiente] [branch]
# Exemplo: ./deploy.sh production main

set -e

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

# Configurações
ENVIRONMENT=${1:-staging}
BRANCH=${2:-main}
PROJECT_NAME="waygest-gestao"
TIMESTAMP=$(date +"%Y%m%d_%H%M%S")

# Função para log
log() {
    echo -e "${BLUE}[$(date +'%Y-%m-%d %H:%M:%S')]${NC} $1"
}

error() {
    echo -e "${RED}[ERROR]${NC} $1"
    exit 1
}

success() {
    echo -e "${GREEN}[SUCCESS]${NC} $1"
}

warning() {
    echo -e "${YELLOW}[WARNING]${NC} $1"
}

# Verificar se estamos no diretório correto
if [ ! -f "artisan" ]; then
    error "Arquivo artisan não encontrado. Execute este script no diretório raiz do projeto Laravel."
fi

log "🚀 Iniciando deploy do WayGest Gestão"
log "📋 Ambiente: $ENVIRONMENT"
log "🌿 Branch: $BRANCH"
log "⏰ Timestamp: $TIMESTAMP"

# Verificar se o Git está limpo
if [ -n "$(git status --porcelain)" ]; then
    error "Working directory não está limpo. Faça commit das alterações antes do deploy."
fi

# Verificar se estamos na branch correta
CURRENT_BRANCH=$(git branch --show-current)
if [ "$CURRENT_BRANCH" != "$BRANCH" ]; then
    warning "Você está na branch '$CURRENT_BRANCH', mas o deploy será feito da branch '$BRANCH'"
    read -p "Deseja continuar? (y/N): " -n 1 -r
    echo
    if [[ ! $REPLY =~ ^[Yy]$ ]]; then
        exit 1
    fi
fi

# Fazer pull da branch
log "📥 Fazendo pull da branch $BRANCH..."
git pull origin $BRANCH

# Verificar se há atualizações
if [ "$(git rev-parse HEAD)" = "$(git rev-parse @{u})" ]; then
    warning "Nenhuma atualização encontrada. Deploy cancelado."
    exit 0
fi

# Instalar/atualizar dependências
log "📦 Instalando dependências..."
composer install --no-dev --optimize-autoloader --no-interaction

# Executar testes (se existirem)
if [ -d "tests" ]; then
    log "🧪 Executando testes..."
    php artisan test || warning "Alguns testes falharam, mas continuando o deploy..."
fi

# Limpar caches
log "🧹 Limpando caches..."
php artisan config:clear
php artisan route:clear
php artisan view:clear
php artisan cache:clear

# Executar migrações
log "🔄 Executando migrações..."
php artisan migrate --force

# Executar seeders (apenas em staging)
if [ "$ENVIRONMENT" = "staging" ]; then
    log "🌱 Executando seeders..."
    php artisan db:seed --force
fi

# Otimizar para produção
log "⚡ Otimizando para produção..."
php artisan config:cache
php artisan route:cache
php artisan view:cache

# Configurar permissões
log "🔐 Configurando permissões..."
chmod -R 755 storage bootstrap/cache
chown -R www-data:www-data storage bootstrap/cache 2>/dev/null || true

# Reiniciar serviços
log "🔄 Reiniciando serviços..."

# Reiniciar PHP-FPM
if command -v systemctl &> /dev/null; then
    sudo systemctl reload php8.2-fpm 2>/dev/null || sudo systemctl reload php-fpm 2>/dev/null || true
fi

# Reiniciar Nginx
if command -v systemctl &> /dev/null; then
    sudo systemctl reload nginx 2>/dev/null || true
fi

# Reiniciar queue workers
log "🔄 Reiniciando queue workers..."
php artisan queue:restart

# Verificar saúde da aplicação
log "🏥 Verificando saúde da aplicação..."
if php artisan tinker --execute="echo 'OK';" > /dev/null 2>&1; then
    success "✅ Aplicação funcionando corretamente"
else
    error "❌ Aplicação com problemas"
fi

# Log do deploy
log "📝 Registrando deploy..."
echo "$(date): Deploy $ENVIRONMENT - Branch: $BRANCH - Commit: $(git rev-parse --short HEAD)" >> storage/logs/deploy.log

# Notificação de sucesso
success "🎉 Deploy concluído com sucesso!"
log "📊 Ambiente: $ENVIRONMENT"
log "🌿 Branch: $BRANCH"
log "📝 Commit: $(git rev-parse --short HEAD)"
log "⏰ Concluído em: $(date)"

# Mostrar status final
log "📈 Status da aplicação:"
php artisan about | head -10

echo ""
success "🚀 WayGest Gestão está online e funcionando!"
