#!/bin/bash
# Script para configurar Nginx como proxy reverso para GestorStream
# Frontend (React/Vite) na porta 5173
# Backend (Laravel) na porta 8080

set -e

DOMAIN="gestor.jf.eng.br"

echo "🔧 =========================================="
echo "   Configuração Nginx - Proxy Reverso"
echo "   Domínio: $DOMAIN"
echo "=========================================="
echo ""

echo "🔍 [1/6] Verificando containers Docker..."
echo "---"

# Verificar se Docker está rodando
if ! command -v docker >/dev/null 2>&1; then
    echo "❌ Docker não está instalado!"
    exit 1
fi

echo "📊 Containers rodando:"
docker ps --format "table {{.Names}}\t{{.Ports}}" | grep -E "(frontend|backend|nginx)" || echo "⚠️ Nenhum container encontrado"
echo ""

# Verificar portas
echo "🔌 Verificando portas em uso:"
echo "---"
netstat -tlnp | grep -E ":(80|5173|8080)" || echo "⚠️ Nenhuma porta ativa"
echo ""

echo "📝 [2/6] Criando configuração do Nginx..."
echo "---"

# Criar configuração completa
cat > /tmp/gestorstream-proxy.conf << 'NGINXCONF'
# Frontend (React/Vite) - Servidor principal
server {
    listen 80;
    listen [::]:80;
    server_name gestor.jf.eng.br;

    root /var/www/gestorstream/frontend/dist;
    index index.html;

    # Logs
    access_log /var/log/nginx/gestorstream-access.log;
    error_log /var/log/nginx/gestorstream-error.log;

    # Client config
    client_max_body_size 100M;

    # Frontend - SPA (arquivos estáticos)
    location / {
        try_files $uri $uri/ /index.html;
        # Cache control para index.html (não cachear para pegar novas versões)
        add_header Cache-Control "no-cache, no-store, must-revalidate" always;
    }

    # Arquivos estáticos do frontend (JS, CSS, imagens, fontes) - cache longo
    location ~* \.(js|css|png|jpg|jpeg|gif|ico|svg|woff|woff2|ttf|eot|map)$ {
        expires 1y;
        add_header Cache-Control "public, immutable";
        # Permitir CORS se necessário
        add_header Access-Control-Allow-Origin *;
    }

    # Backend API - porta 8000
    location /api {
        proxy_pass http://127.0.0.1:8000;
        proxy_http_version 1.1;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection 'upgrade';
        proxy_set_header Host $host;
        proxy_cache_bypass $http_upgrade;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;
        
        # Timeouts
        proxy_connect_timeout 60s;
        proxy_send_timeout 60s;
        proxy_read_timeout 60s;
    }

    # Storage (uploads)
    location /storage {
        alias /var/www/gestorstream/backend/storage/app/public;
        try_files $uri $uri/ =404;
        expires 30d;
        add_header Cache-Control "public, immutable";
    }
}
NGINXCONF

echo "✅ Configuração criada em /tmp/gestorstream-proxy.conf"
echo ""
echo "📋 Conteúdo:"
cat /tmp/gestorstream-proxy.conf
echo ""

echo "💾 [3/6] Aplicando configuração..."
echo "---"

# Backup de configs antigas
if [ -f /etc/nginx/sites-available/gestorstream ]; then
    cp /etc/nginx/sites-available/gestorstream /etc/nginx/sites-available/gestorstream.backup.$(date +%Y%m%d_%H%M%S)
    echo "✅ Backup criado"
fi

# Copiar nova config
cp /tmp/gestorstream-proxy.conf /etc/nginx/sites-available/gestorstream

# Remover configs antigas conflitantes
rm -f /etc/nginx/sites-enabled/default
rm -f /etc/nginx/sites-enabled/gestorstream

# Criar link simbólico
ln -sf /etc/nginx/sites-available/gestorstream /etc/nginx/sites-enabled/gestorstream

echo "✅ Configuração aplicada"
echo ""

echo "🧪 [4/6] Testando configuração..."
echo "---"

nginx -t

if [ $? -eq 0 ]; then
    echo "✅ Configuração válida!"
else
    echo "❌ Erro na configuração!"
    exit 1
fi
echo ""

echo "🔄 [5/6] Recarregando Nginx..."
echo "---"

systemctl reload nginx

if [ $? -eq 0 ]; then
    echo "✅ Nginx recarregado!"
else
    echo "❌ Erro ao recarregar Nginx"
    systemctl status nginx --no-pager
    exit 1
fi
echo ""

echo "🔍 [6/6] Verificando conectividade..."
echo "---"

echo "📡 Testando frontend (porta 5173):"
curl -I http://localhost:5173 2>/dev/null | head -n 1 || echo "⚠️ Frontend não está respondendo"

echo ""
echo "📡 Testando backend (porta 8080):"
curl -I http://localhost:8080 2>/dev/null | head -n 1 || echo "⚠️ Backend não está respondendo"

echo ""

echo "🎉 =========================================="
echo "   Configuração Concluída!"
echo "=========================================="
echo ""
echo "🌐 Acesse agora: http://$DOMAIN"
echo ""
echo "📊 Mapeamento de rotas:"
echo "   http://$DOMAIN/          → Frontend (React/Vite) :5173"
echo "   http://$DOMAIN/api       → Backend (Laravel) :8080"
echo "   http://$DOMAIN/storage   → Storage (Laravel) :8080"
echo ""
echo "🔍 Se não funcionar, verifique:"
echo "   1. Containers Docker estão rodando? → docker ps"
echo "   2. Portas estão abertas? → netstat -tlnp | grep -E '(5173|8080)'"
echo "   3. DNS está apontando corretamente? → nslookup $DOMAIN"
echo ""
echo "📝 Logs em tempo real:"
echo "   tail -f /var/log/nginx/gestorstream-access.log"
echo "   tail -f /var/log/nginx/gestorstream-error.log"
