#!/bin/bash

# Script de Atualização Automática
# Chamado pelo Job PerformSystemUpdate

VERSION=$1

if [ -z "$VERSION" ]; then
    echo "Erro: Versão não especificada"
    exit 1
fi

echo "======================================"
echo "  Auto-Update: $VERSION"
echo "======================================"
echo ""

APP_DIR="/var/www/gestorstream"
cd "$APP_DIR"

# 1. Atualizar Código
echo "📥 [1/6] Baixando versão $VERSION..."

# Corrigir permissões de arquivos .md antes de atualizar
echo "🔧 Corrigindo permissões de arquivos .md..."
find . -name "*.md" -type f -exec chmod 664 {} \; 2>/dev/null || true
find . -name "*.md" -type f -exec chown www-data:www-data {} \; 2>/dev/null || true

# Fazer stash de alterações locais (mais seguro que reset --hard)
git stash push -m "Auto-update stash $(date +%Y%m%d_%H%M%S)" 2>/dev/null || true

# Atualizar código
git fetch --tags
git fetch origin

# Tentar checkout sem forçar primeiro
# Se VERSION for "main" ou "latest", usar branch main
if [ "$VERSION" = "main" ] || [ "$VERSION" = "latest" ]; then
    echo "📌 Usando branch main..."
    git checkout main 2>/dev/null || git checkout -b main origin/main
    git pull origin main
else
    # Para tags, tentar checkout normalmente
    if ! git checkout "$VERSION" 2>/dev/null; then
        echo "⚠️  Conflitos detectados, limpando alterações locais..."
        git reset --hard HEAD
        git clean -fd
        git checkout "$VERSION"
    fi
fi

# 2. Backend
echo "🔧 [2/6] Atualizando Backend..."
cd backend

# DESABILITAR MODO DE MANUTENÇÃO IMEDIATAMENTE (se existir)
# IMPORTANTE: Fazer isso ANTES de qualquer operação que possa travar
if [ -f "storage/framework/maintenance.php" ]; then
    echo "🔓 Removendo modo de manutenção..."
    rm -f storage/framework/maintenance.php
fi

# Garantir que não há processos composer travados
echo "🔍 Verificando processos composer travados..."
pkill -9 composer 2>/dev/null || true
sleep 1

# Verificar se composer.lock está desatualizado
# Usar timeout para evitar travamento
if ! timeout 300 composer validate --no-check-publish 2>/dev/null || ! timeout 300 composer install --dry-run --no-dev --no-interaction 2>/dev/null; then
    echo "📦 composer.lock desatualizado, atualizando dependências..."
    # Atualizar composer.lock primeiro (com timeout)
    timeout 600 COMPOSER_ALLOW_SUPERUSER=1 composer update --no-dev --no-interaction --no-scripts || {
        echo "⚠️  Erro ao atualizar composer.lock, tentando instalar dependências diretamente..."
        timeout 600 COMPOSER_ALLOW_SUPERUSER=1 composer install --no-dev --optimize-autoloader --no-interaction --ignore-platform-reqs || {
            echo "❌ Erro crítico ao instalar dependências do Composer"
            echo "   Removendo arquivo de manutenção antes de sair..."
            rm -f storage/framework/maintenance.php
            echo "   Execute manualmente: cd backend && composer update --no-dev"
            exit 1
        }
    }
fi

# Instalar dependências (com timeout para evitar travamento)
echo "📦 Instalando dependências do Composer..."
timeout 600 COMPOSER_ALLOW_SUPERUSER=1 composer install --no-dev --optimize-autoloader --no-interaction || {
    echo "⚠️  Erro ao instalar, tentando com --ignore-platform-reqs..."
    timeout 600 COMPOSER_ALLOW_SUPERUSER=1 composer install --no-dev --optimize-autoloader --no-interaction --ignore-platform-reqs || {
        echo "❌ Erro ao instalar dependências"
        echo "   Removendo arquivo de manutenção antes de sair..."
        rm -f storage/framework/maintenance.php
        exit 1
    }
}

# Verificar se AWS SDK está instalado
if ! composer show aws/aws-sdk-php > /dev/null 2>&1; then
    echo "📦 Instalando AWS SDK para backup automático..."
    COMPOSER_ALLOW_SUPERUSER=1 composer require aws/aws-sdk-php --no-interaction --no-scripts || {
        echo "⚠️  Conflito de dependências detectado, tentando com --with-all-dependencies..."
        COMPOSER_ALLOW_SUPERUSER=1 composer require aws/aws-sdk-php --with-all-dependencies --no-interaction --no-scripts || {
            echo "⚠️  Ainda com conflito, tentando com --ignore-platform-reqs..."
            COMPOSER_ALLOW_SUPERUSER=1 composer require aws/aws-sdk-php --ignore-platform-reqs --no-interaction --no-scripts || {
                echo "❌ Não foi possível instalar AWS SDK automaticamente."
                echo "   Execute manualmente: composer require aws/aws-sdk-php --with-all-dependencies"
            }
        }
    }
    # Reinstalar após adicionar nova dependência
    COMPOSER_ALLOW_SUPERUSER=1 composer install --no-dev --optimize-autoloader --no-interaction
fi

# Executar migrations e limpar cache
# IMPORTANTE: Sempre garantir que manutenção está desabilitada após cada operação
php artisan migrate --force || {
    echo "⚠️  Erro em migrations, mas continuando..."
    rm -f storage/framework/maintenance.php
}
php artisan db:seed --class=PlanSeeder --force || echo "⚠️  Erro em seed, mas continuando..."
php artisan config:clear
php artisan route:clear
php artisan cache:clear

# GARANTIR QUE MODO DE MANUTENÇÃO ESTÁ DESABILITADO
rm -f storage/framework/maintenance.php

# Criar diretório de backups se não existir
mkdir -p storage/app/backups
chown -R www-data:www-data storage/app/backups
chmod -R 775 storage/app/backups

cd ..

# 3. Frontend (pular se SKIP_FRONTEND_BUILD estiver definido)
if [ -z "$SKIP_FRONTEND_BUILD" ]; then
    echo "⚛️  [3/6] Compilando Frontend..."
    chmod -R +x frontend/node_modules/.bin/  # Dar permissão ANTES do build
    cd frontend
    npm install
    npm run build
    cd ..
else
    echo "⚛️  [3/6] Pulando compilação do Frontend (SKIP_FRONTEND_BUILD definido)..."
fi

# 4. Permissões
echo "🔐 [4/6] Corrigindo Permissões..."
chown -R www-data:www-data .
find . -type d -exec chmod 775 {} \;
find . -type f -exec chmod 664 {} \;

# Garantir permissões especiais para arquivos executáveis
chmod +x backend/artisan update.sh 2>/dev/null || true
if [ -d "frontend/node_modules/.bin" ]; then
    chmod -R +x frontend/node_modules/.bin/ 2>/dev/null || true
fi

# Garantir que arquivos .md tenham permissões corretas
find . -name "*.md" -type f -exec chmod 664 {} \; 2>/dev/null || true
find . -name "*.md" -type f -exec chown www-data:www-data {} \; 2>/dev/null || true

# 5. Limpar Cache do Nginx (se existir)
echo "🗑️  [5/6] Limpando Cache..."
if [ -d "/var/cache/nginx" ]; then
    rm -rf /var/cache/nginx/*
fi

# 6. Reiniciar Serviços
echo "🔄 [6/6] Reiniciando Serviços..."
# Verificar se os serviços existem antes de reiniciar
systemctl restart gestorstream-backend 2>/dev/null || systemctl restart php*-fpm 2>/dev/null || true
systemctl restart gestorstream-worker 2>/dev/null || systemctl restart laravel-queue.service 2>/dev/null || true

# GARANTIR QUE MODO DE MANUTENÇÃO ESTÁ DESABILITADO APÓS REINÍCIO
cd backend
rm -f storage/framework/maintenance.php
php artisan config:clear 2>/dev/null || true
php artisan route:clear 2>/dev/null || true
php artisan cache:clear 2>/dev/null || true
cd ..

# ÚLTIMA VERIFICAÇÃO: Garantir que não há arquivo de manutenção
cd backend
rm -f storage/framework/maintenance.php
cd ..

echo "✅ Atualização para $VERSION concluída com sucesso!"
echo "🔓 Modo de manutenção DESABILITADO"
