#!/bin/bash
# INSTALADOR MESTRE GESTORSTREAM
# Instalação do zero com Banco Remoto e Configuração de Domínio

set -e

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

echo -e "${GREEN}==============================================${NC}"
echo -e "${GREEN}   INSTALADOR GESTORSTREAM - SETUP COMPLETO   ${NC}"
echo -e "${GREEN}==============================================${NC}"
echo ""

# 1. VERIFICAÇÃO DE DEPENDÊNCIAS DO SISTEMA
echo -e "${YELLOW}🔍 [1/7] Verificando dependências do sistema...${NC}"

# Função para instalar Docker
install_docker() {
    echo "📦 Instalando Docker..."
    curl -fsSL https://get.docker.com -o get-docker.sh
    sh get-docker.sh
    rm get-docker.sh
}

# Verificar Docker
if ! command -v docker &> /dev/null; then
    install_docker
else
    echo "✅ Docker já instalado"
fi

# Verificar Nginx
if ! command -v nginx &> /dev/null; then
    echo "📦 Instalando Nginx..."
    apt-get update && apt-get install -y nginx
else
    echo "✅ Nginx já instalado"
fi

echo ""

# 2. COLETA DE DADOS (INTERATIVO)
echo -e "${YELLOW}📝 [2/7] Configuração do Banco de Dados Remoto${NC}"
echo "Por favor, insira os dados do seu banco de dados remoto:"

read -p "DB Host (IP ou Domínio): " DB_HOST
read -p "DB Port (Padrão 3306): " DB_PORT
DB_PORT=${DB_PORT:-3306}
read -p "DB Database Name: " DB_DATABASE
read -p "DB Username: " DB_USERNAME
read -s -p "DB Password: " DB_PASSWORD
echo ""
echo ""

echo -e "${YELLOW}👤 [3/7] Configuração do Usuário Admin${NC}"
read -p "Nome do Admin: " ADMIN_NAME
read -p "Email do Admin: " ADMIN_EMAIL
read -s -p "Senha do Admin: " ADMIN_PASSWORD
echo ""
echo ""

# 3. CONFIGURAÇÃO DO AMBIENTE (.env)
echo -e "${YELLOW}⚙️  [4/7] Configurando ambiente...${NC}"

# Copiar .env.example se não existir .env
if [ ! -f backend/.env ]; then
    cp backend/.env.example backend/.env
fi

# Atualizar .env com os dados do banco
# Usamos sed para substituir as linhas
sed -i "s/DB_HOST=.*/DB_HOST=${DB_HOST}/" backend/.env
sed -i "s/DB_PORT=.*/DB_PORT=${DB_PORT}/" backend/.env
sed -i "s/DB_DATABASE=.*/DB_DATABASE=${DB_DATABASE}/" backend/.env
sed -i "s/DB_USERNAME=.*/DB_USERNAME=${DB_USERNAME}/" backend/.env
sed -i "s/DB_PASSWORD=.*/DB_PASSWORD=${DB_PASSWORD}/" backend/.env

# Ajustar URL da aplicação
sed -i "s|APP_URL=.*|APP_URL=http://gestor.jf.eng.br|" backend/.env
sed -i "s|SANCTUM_STATEFUL_DOMAINS=.*|SANCTUM_STATEFUL_DOMAINS=gestor.jf.eng.br,localhost:5173|" backend/.env
sed -i "s|SESSION_DOMAIN=.*|SESSION_DOMAIN=.jf.eng.br|" backend/.env

# COPIAR .ENV PARA A RAIZ (Correção do erro docker-compose)
cp backend/.env .env

echo "✅ Arquivo .env configurado e copiado para a raiz."
echo ""

# CORREÇÃO DO DOCKER-COMPOSE.YML (Remover version obsolete)
if [ -f docker-compose.yml ]; then
    sed -i "/version: '3.8'/d" docker-compose.yml
fi

# 4. SUBINDO CONTAINERS
echo -e "${YELLOW}🐳 [5/7] Iniciando aplicação (Docker)...${NC}"

# Derrubar containers antigos se existirem
docker compose down 2>/dev/null || docker-compose down 2>/dev/null || true

# Subir novos containers (usando docker compose V2 ou docker-compose V1)
if docker compose version &> /dev/null; then
    DOCKER_CMD="docker compose"
else
    if command -v docker-compose &> /dev/null; then
        DOCKER_CMD="docker-compose"
    else
        echo "⚠️ docker-compose não encontrado. Tentando instalar plugin..."
        apt-get update && apt-get install -y docker-compose-plugin
        DOCKER_CMD="docker compose"
    fi
fi

$DOCKER_CMD up -d --build

echo "⏳ Aguardando backend iniciar..."
sleep 15

# Instalar dependências no container
echo "📦 Instalando dependências PHP..."
$DOCKER_CMD exec -T backend composer install --no-dev --optimize-autoloader --no-interaction

# Gerar Key
$DOCKER_CMD exec -T backend php artisan key:generate --force

echo "✅ Aplicação iniciada."
echo ""

# 5. MIGRAÇÃO E CRIAÇÃO DE ADMIN
echo -e "${YELLOW}🗄️  [6/7] Configurando Banco de Dados...${NC}"

echo "🔄 Rodando Migrations..."
$DOCKER_CMD exec -T backend php artisan migrate --force

echo "👤 Criando Usuário Admin..."
# Usamos o Tinker para criar o usuário programaticamente
$DOCKER_CMD exec -T backend php artisan tinker --execute="
try {
    \$user = \App\Models\User::where('email', '$ADMIN_EMAIL')->first();
    if (!\$user) {
        \$user = new \App\Models\User();
        \$user->name = '$ADMIN_NAME';
        \$user->email = '$ADMIN_EMAIL';
        \$user->password = \Illuminate\Support\Facades\Hash::make('$ADMIN_PASSWORD');
        \$user->role = 'admin'; 
        \$user->save();
        echo '✅ Usuário Admin criado com sucesso!';
    } else {
        \$user->password = \Illuminate\Support\Facades\Hash::make('$ADMIN_PASSWORD');
        \$user->role = 'admin';
        \$user->save();
        echo '✅ Usuário Admin atualizado!';
    }
} catch (\Exception \$e) {
    echo '❌ Erro ao criar admin: ' . \$e->getMessage();
}
"

echo ""

# 6. CONFIGURAÇÃO NGINX
echo -e "${YELLOW}🌐 [7/7] Configurando Domínio (Nginx)...${NC}"

cat > /etc/nginx/sites-available/gestorstream << 'EOF'
server {
    listen 80;
    listen [::]:80;
    server_name gestor.jf.eng.br;

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

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

    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;
        
        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";
    }
}
EOF

# Ativar site
rm -f /etc/nginx/sites-enabled/default
rm -f /etc/nginx/sites-enabled/gestorstream
ln -sf /etc/nginx/sites-available/gestorstream /etc/nginx/sites-enabled/gestorstream

# Testar e recarregar
if nginx -t; then
    systemctl reload nginx
    echo "✅ Nginx configurado com sucesso!"
else
    echo -e "${RED}❌ Erro na configuração do Nginx${NC}"
fi

echo ""
echo -e "${GREEN}==============================================${NC}"
echo -e "${GREEN}   INSTALAÇÃO CONCLUÍDA! 🚀   ${NC}"
echo -e "${GREEN}==============================================${NC}"
echo "Acesse: http://gestor.jf.eng.br"
echo "Login: $ADMIN_EMAIL"
echo ""
