#!/bin/bash

# Script para corrigir erro 403 após atualização
# Este script garante que o diretório dist/ existe, tem conteúdo e permissões corretas

FRONTEND_DIR="/var/www/gestorstream/frontend"
DIST_DIR="$FRONTEND_DIR/dist"
LOG_FILE="/var/www/gestorstream/backend/storage/logs/corrigir-403.log"
NPM_PATH=$(which npm 2>/dev/null || echo "/usr/bin/npm")

echo "=========================================" | tee "$LOG_FILE"
echo "[$(date)] Iniciando correção de erro 403" | tee -a "$LOG_FILE"
echo "=========================================" | tee -a "$LOG_FILE"

# Verificar se o diretório frontend existe
if [ ! -d "$FRONTEND_DIR" ]; then
    echo "ERRO: Diretório $FRONTEND_DIR não encontrado" | tee -a "$LOG_FILE"
    exit 1
fi

cd "$FRONTEND_DIR" || exit 1

# Verificar usuário atual
CURRENT_USER=$(whoami)
echo "Usuário atual: $CURRENT_USER" | tee -a "$LOG_FILE"

# Verificar se npm está disponível
if [ ! -x "$NPM_PATH" ]; then
    echo "ERRO: npm não encontrado ou não executável em $NPM_PATH" | tee -a "$LOG_FILE"
    exit 1
fi

# Verificar se dist/ existe
if [ ! -d "$DIST_DIR" ]; then
    echo "AVISO: Diretório dist/ não existe. Criando..." | tee -a "$LOG_FILE"
    mkdir -p "$DIST_DIR"
    chmod 755 "$DIST_DIR"
    # Se executado como root, ajustar owner
    if [ "$EUID" -eq 0 ]; then
        chown www-data:www-data "$DIST_DIR"
    fi
fi

# Verificar se dist/index.html existe
if [ ! -f "$DIST_DIR/index.html" ]; then
    echo "ERRO CRÍTICO: dist/index.html não existe! Isso causa erro 403." | tee -a "$LOG_FILE"
    echo "Reconstruindo frontend..." | tee -a "$LOG_FILE"
    
    # Limpar dist/ completamente se tivermos permissão
    if [ -w "$DIST_DIR" ] || [ "$EUID" -eq 0 ]; then
        echo "Limpando dist/..." | tee -a "$LOG_FILE"
        rm -rf "$DIST_DIR"/* 2>/dev/null || true
        if [ "$EUID" -eq 0 ]; then
            rm -rf "$DIST_DIR" 2>/dev/null || true
            mkdir -p "$DIST_DIR"
            chown www-data:www-data "$DIST_DIR"
        fi
    fi
    
    # Verificar se node_modules existe
    if [ ! -d "$FRONTEND_DIR/node_modules" ]; then
        echo "Instalando dependências..." | tee -a "$LOG_FILE"
        $NPM_PATH install --no-audit --no-fund 2>&1 | tee -a "$LOG_FILE"
        INSTALL_EXIT=$?
        if [ $INSTALL_EXIT -ne 0 ]; then
            echo "ERRO: npm install falhou com código $INSTALL_EXIT" | tee -a "$LOG_FILE"
            exit 1
        fi
    fi
    
    # Garantir permissões corretas em node_modules/.bin
    if [ -d "$FRONTEND_DIR/node_modules/.bin" ]; then
        echo "Ajustando permissões de node_modules/.bin..." | tee -a "$LOG_FILE"
        find "$FRONTEND_DIR/node_modules/.bin" -type f -exec chmod +x {} \; 2>/dev/null || true
        if [ "$EUID" -eq 0 ]; then
            chown -R www-data:www-data "$FRONTEND_DIR/node_modules/.bin" 2>/dev/null || true
        fi
    fi
    
    # Reconstruir frontend
    echo "Executando build do frontend..." | tee -a "$LOG_FILE"
    export NODE_OPTIONS="--max-old-space-size=4096"
    $NPM_PATH run build 2>&1 | tee -a "$LOG_FILE"
    
    BUILD_EXIT=$?
    if [ $BUILD_EXIT -ne 0 ]; then
        echo "ERRO: Build falhou com código $BUILD_EXIT" | tee -a "$LOG_FILE"
        echo "Tentando novamente..." | tee -a "$LOG_FILE"
        # Segunda tentativa
        $NPM_PATH run build 2>&1 | tee -a "$LOG_FILE"
        BUILD_EXIT=$?
        if [ $BUILD_EXIT -ne 0 ]; then
            echo "ERRO: Build falhou novamente com código $BUILD_EXIT" | tee -a "$LOG_FILE"
            exit 1
        fi
    fi
fi

# Verificar se index.html foi criado
if [ ! -f "$DIST_DIR/index.html" ]; then
    echo "ERRO: index.html ainda não existe após o build!" | tee -a "$LOG_FILE"
    echo "Verificando estrutura do dist/..." | tee -a "$LOG_FILE"
    ls -la "$DIST_DIR" | tee -a "$LOG_FILE"
    exit 1
fi

echo "SUCESSO: index.html existe!" | tee -a "$LOG_FILE"

# Ajustar permissões do dist/ (garantir que www-data pode ler)
echo "Ajustando permissões do dist/..." | tee -a "$LOG_FILE"

# Se executado como root, ajustar owner
if [ "$EUID" -eq 0 ]; then
    echo "Executando como root. Ajustando owner para www-data..." | tee -a "$LOG_FILE"
    chown -R www-data:www-data "$DIST_DIR" 2>/dev/null || true
fi

# Ajustar permissões de leitura (garantir que todos podem ler)
echo "Ajustando permissões de diretórios..." | tee -a "$LOG_FILE"
find "$DIST_DIR" -type d -exec chmod 755 {} \; 2>/dev/null || true
echo "Ajustando permissões de arquivos..." | tee -a "$LOG_FILE"
find "$DIST_DIR" -type f -exec chmod 644 {} \; 2>/dev/null || true

# Verificar permissões do index.html especificamente
if [ -f "$DIST_DIR/index.html" ]; then
    PERMS=$(stat -c "%a" "$DIST_DIR/index.html" 2>/dev/null || echo "unknown")
    echo "Permissões do index.html: $PERMS" | tee -a "$LOG_FILE"
    
    # Garantir que é legível
    chmod 644 "$DIST_DIR/index.html" 2>/dev/null || true
    
    # Verificar se www-data pode ler
    if [ "$EUID" -eq 0 ]; then
        if sudo -u www-data test -r "$DIST_DIR/index.html"; then
            echo "SUCESSO: www-data pode ler index.html" | tee -a "$LOG_FILE"
        else
            echo "AVISO: www-data não pode ler index.html. Ajustando permissões..." | tee -a "$LOG_FILE"
            chmod 644 "$DIST_DIR/index.html"
            chown www-data:www-data "$DIST_DIR/index.html"
        fi
    fi
fi

# Verificar estrutura do dist/
echo "Verificando estrutura do dist/..." | tee -a "$LOG_FILE"
FILE_COUNT=$(find "$DIST_DIR" -type f | wc -l)
echo "Arquivos em dist/: $FILE_COUNT" | tee -a "$LOG_FILE"

if [ "$FILE_COUNT" -eq 0 ]; then
    echo "ERRO: dist/ está vazio! Reconstruindo..." | tee -a "$LOG_FILE"
    npm run build 2>&1 | tee -a "$LOG_FILE"
fi

# Listar arquivos principais esperados
echo "Arquivos principais esperados:" | tee -a "$LOG_FILE"
for file in "index.html" "assets/index.js" "assets/index.css"; do
    if [ -f "$DIST_DIR/$file" ]; then
        echo "  ✓ $file existe" | tee -a "$LOG_FILE"
    else
        echo "  ✗ $file NÃO existe" | tee -a "$LOG_FILE"
    fi
done

echo "=========================================" | tee -a "$LOG_FILE"
echo "[$(date)] Correção concluída" | tee -a "$LOG_FILE"
echo "=========================================" | tee -a "$LOG_FILE"

exit 0

