#!/bin/bash

# Script para executar todos os testes integrados do BFF PlanFi
# Este script executa testes E2E para todos os módulos do sistema

echo "🚀 Executando Testes Integrados do BFF PlanFi"
echo "=============================================="
echo ""

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

# Função para imprimir com cores
print_status() {
    echo -e "${BLUE}[INFO]${NC} $1"
}

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

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

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

# Verificar se o Node.js está instalado
if ! command -v node &> /dev/null; then
    print_error "Node.js não está instalado. Por favor, instale o Node.js primeiro."
    exit 1
fi

# Verificar se o yarn está instalado
if ! command -v yarn &> /dev/null; then
    print_error "Yarn não está instalado. Por favor, instale o Yarn primeiro."
    exit 1
fi

# Verificar se estamos no diretório correto
if [ ! -f "package.json" ]; then
    print_error "package.json não encontrado. Execute este script no diretório raiz do projeto BFF."
    exit 1
fi

print_status "Verificando dependências..."

# Instalar dependências se necessário
if [ ! -d "node_modules" ]; then
    print_status "Instalando dependências..."
    yarn install
    if [ $? -ne 0 ]; then
        print_error "Falha ao instalar dependências."
        exit 1
    fi
fi

print_status "Dependências verificadas."

# Verificar se o banco de dados está configurado
print_status "Verificando configuração do banco de dados..."

# Verificar variáveis de ambiente
if [ ! -f ".env" ] && [ ! -f ".env.development" ]; then
    print_warning "Arquivo .env não encontrado. Criando arquivo de exemplo..."
    cat > .env.development << EOF
# Configuração do MongoDB
MONGODB_URI=mongodb://admin:admin@localhost:27017

# Configuração JWT
JWT_SECRET=test-secret-key
JWT_ALGORITHM=HS256

# Configuração da API
API_KEY=JOqyUcP45H875xmuI2gT3H9dDK42I2Wt

# Configuração do Pluggy
PLUGGY_CLIENT_ID=test-client-id
PLUGGY_CLIENT_SECRET=test-client-secret
PLUGGY_API_URL=https://api.pluggy.ai
EOF
    print_warning "Arquivo .env.development criado com configurações de exemplo."
    print_warning "Ajuste as configurações conforme necessário antes de executar os testes."
fi

# Função para executar testes de um módulo específico
run_module_tests() {
    local module_name=$1
    local test_file=$2
    
    print_status "Executando testes do módulo: $module_name"
    echo "----------------------------------------"
    
    if [ -f "$test_file" ]; then
        yarn test:e2e --testPathPattern="$test_file" --verbose
        local exit_code=$?
        
        if [ $exit_code -eq 0 ]; then
            print_success "Testes do módulo $module_name passaram com sucesso!"
        else
            print_error "Testes do módulo $module_name falharam!"
        fi
        
        echo ""
        return $exit_code
    else
        print_error "Arquivo de teste não encontrado: $test_file"
        return 1
    fi
}

# Função para executar todos os testes
run_all_tests() {
    print_status "Executando todos os testes integrados..."
    echo "=============================================="
    
    yarn test:e2e --verbose
    local exit_code=$?
    
    if [ $exit_code -eq 0 ]; then
        print_success "Todos os testes integrados passaram com sucesso! 🎉"
    else
        print_error "Alguns testes falharam. Verifique os logs acima."
    fi
    
    return $exit_code
}

# Função para executar testes com cobertura
run_tests_with_coverage() {
    print_status "Executando testes com cobertura de código..."
    echo "=================================================="
    
    yarn test:e2e --coverage --verbose
    local exit_code=$?
    
    if [ $exit_code -eq 0 ]; then
        print_success "Testes com cobertura executados com sucesso!"
        print_status "Relatório de cobertura disponível em: coverage/lcov-report/index.html"
    else
        print_error "Testes com cobertura falharam."
    fi
    
    return $exit_code
}

# Função para mostrar estatísticas dos testes
show_test_stats() {
    print_status "Estatísticas dos testes:"
    echo "=========================="
    
    local total_tests=0
    local passed_tests=0
    local failed_tests=0
    
    # Contar arquivos de teste
    for test_file in test/*.e2e-spec.ts; do
        if [ -f "$test_file" ]; then
            total_tests=$((total_tests + 1))
            echo "📄 $(basename "$test_file")"
        fi
    done
    
    echo ""
    echo "📊 Total de arquivos de teste: $total_tests"
    echo "📁 Diretório de testes: test/"
    echo "🔧 Configuração: jest-e2e.json"
    echo ""
}

# Função para mostrar ajuda
show_help() {
    echo "Uso: $0 [OPÇÃO]"
    echo ""
    echo "Opções:"
    echo "  all              Executa todos os testes integrados (padrão)"
    echo "  auth             Executa apenas testes do módulo Auth"
    echo "  pluggy           Executa apenas testes do módulo Pluggy"
    echo "  laravel-api      Executa apenas testes do módulo Laravel API"
    echo "  openfinance      Executa apenas testes do módulo OpenFinance"
    echo "  coverage         Executa todos os testes com cobertura"
    echo "  stats            Mostra estatísticas dos testes"
    echo "  help             Mostra esta ajuda"
    echo ""
    echo "Exemplos:"
    echo "  $0                    # Executa todos os testes"
    echo "  $0 coverage           # Executa testes com cobertura"
    echo "  $0 stats              # Mostra estatísticas"
}

# Função principal
main() {
    case "${1:-all}" in
        "all")
            run_all_tests
            ;;
        "auth")
            run_module_tests "Auth" "auth.e2e-spec.ts"
            ;;
        "laravel-api")
            run_module_tests "Laravel API" "laravel-api.e2e-spec.ts"
            ;;
        "pluggy")
            run_module_tests "Pluggy" "pluggy.e2e-spec.ts"
            ;;
        "openfinance")
            run_module_tests "OpenFinance" "openfinance-excluded-transactions.e2e-spec.ts"
            ;;
        "coverage")
            run_tests_with_coverage
            ;;
        "stats")
            show_test_stats
            ;;
        "help"|"-h"|"--help")
            show_help
            ;;
        *)
            print_error "Opção inválida: $1"
            echo ""
            show_help
            exit 1
            ;;
    esac
}

# Executar função principal
main "$@"

# Código de saída baseado no resultado dos testes
exit_code=$?

echo ""
echo "=============================================="
if [ $exit_code -eq 0 ]; then
    print_success "Script executado com sucesso!"
    echo ""
    print_status "Próximos passos:"
    echo "• Verifique os logs acima para detalhes dos testes"
    echo "• Para executar testes específicos, use: $0 [módulo]"
    echo "• Para ver estatísticas, use: $0 stats"
    echo "• Para ver ajuda, use: $0 help"
else
    print_error "Script executado com falhas."
    echo ""
    print_status "Dicas para resolução:"
    echo "• Verifique se o servidor está rodando"
    echo "• Verifique as configurações do banco de dados"
    echo "• Verifique as variáveis de ambiente"
    echo "• Execute testes individuais para isolar problemas"
fi

exit $exit_code
