#!/bin/bash

# 🧪 FRAMEWORK DE TESTS UNIFIÉ - VEZA
# Script pour exécuter tous les tests de manière cohérente

set -e

# Couleurs
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
BLUE='\033[0;34m'
NC='\033[0m'

# Configuration
TEST_RESULTS_DIR="test-results"
COVERAGE_DIR="coverage"
TIMEOUT=300 # 5 minutes

# Fonction pour afficher les messages
log_info() {
    echo -e "${BLUE}ℹ️  $1${NC}"
}

log_success() {
    echo -e "${GREEN}✅ $1${NC}"
}

log_warning() {
    echo -e "${YELLOW}⚠️  $1${NC}"
}

log_error() {
    echo -e "${RED}❌ $1${NC}"
}

# Fonction pour exécuter les tests Go
run_go_tests() {
    local service=$1
    local test_dir=$2
    
    log_info "Exécution des tests Go pour $service..."
    
    if [ ! -d "$test_dir" ]; then
        log_warning "Répertoire $test_dir non trouvé, ignoré"
        return 0
    fi
    
    cd "$test_dir"
    
    # Tests unitaires
    log_info "Tests unitaires..."
    go test -v -race -timeout=${TIMEOUT}s -coverprofile=coverage.out ./... 2>&1 | tee "$TEST_RESULTS_DIR/${service}_unit.log"
    
    # Tests d'intégration
    log_info "Tests d'intégration..."
    go test -v -tags=integration -timeout=${TIMEOUT}s ./... 2>&1 | tee "$TEST_RESULTS_DIR/${service}_integration.log"
    
    # Génération du rapport de couverture
    if [ -f "coverage.out" ]; then
        go tool cover -html=coverage.out -o "$COVERAGE_DIR/${service}_coverage.html"
        go tool cover -func=coverage.out > "$COVERAGE_DIR/${service}_coverage.txt"
    fi
    
    cd - > /dev/null
    log_success "Tests Go pour $service terminés"
}

# Fonction pour exécuter les tests Rust
run_rust_tests() {
    local service=$1
    local test_dir=$2
    
    log_info "Exécution des tests Rust pour $service..."
    
    if [ ! -d "$test_dir" ]; then
        log_warning "Répertoire $test_dir non trouvé, ignoré"
        return 0
    fi
    
    cd "$test_dir"
    
    # Tests unitaires et d'intégration
    cargo test --verbose --all-features 2>&1 | tee "$TEST_RESULTS_DIR/${service}_tests.log"
    
    # Tests de performance
    cargo test --release --verbose --all-features 2>&1 | tee "$TEST_RESULTS_DIR/${service}_perf.log"
    
    # Génération du rapport de couverture (si tarpaulin est installé)
    if command -v cargo-tarpaulin >/dev/null 2>&1; then
        cargo tarpaulin --out Html --output-dir "$COVERAGE_DIR" --name "${service}_coverage"
    fi
    
    cd - > /dev/null
    log_success "Tests Rust pour $service terminés"
}

# Fonction pour exécuter les tests JavaScript/TypeScript
run_js_tests() {
    local service=$1
    local test_dir=$2
    
    log_info "Exécution des tests JS/TS pour $service..."
    
    if [ ! -d "$test_dir" ]; then
        log_warning "Répertoire $test_dir non trouvé, ignoré"
        return 0
    fi
    
    cd "$test_dir"
    
    # Vérifier si Jest est configuré
    if [ -f "package.json" ] && grep -q "jest" package.json; then
        # Tests unitaires
        npm test -- --coverage --watchAll=false 2>&1 | tee "$TEST_RESULTS_DIR/${service}_tests.log"
        
        # Tests E2E si configurés
        if [ -f "e2e.config.js" ] || [ -f "cypress.config.js" ]; then
            npm run test:e2e 2>&1 | tee "$TEST_RESULTS_DIR/${service}_e2e.log"
        fi
    else
        log_warning "Jest non configuré pour $service, ignoré"
    fi
    
    cd - > /dev/null
    log_success "Tests JS/TS pour $service terminés"
}

# Fonction pour exécuter les tests de performance
run_performance_tests() {
    log_info "Exécution des tests de performance..."
    
    # Tests de charge pour l'API
    if command -v k6 >/dev/null 2>&1; then
        log_info "Tests de charge avec k6..."
        k6 run --out json="$TEST_RESULTS_DIR/load_test_results.json" tests/performance/load_test.js 2>&1 | tee "$TEST_RESULTS_DIR/load_test.log"
    fi
    
    # Tests de stress
    if command -v wrk >/dev/null 2>&1; then
        log_info "Tests de stress avec wrk..."
        wrk -t12 -c400 -d30s http://localhost:8080/health 2>&1 | tee "$TEST_RESULTS_DIR/stress_test.log"
    fi
    
    log_success "Tests de performance terminés"
}

# Fonction pour exécuter les tests de sécurité
run_security_tests() {
    log_info "Exécution des tests de sécurité..."
    
    # Scan de vulnérabilités Go
    if command -v gosec >/dev/null 2>&1; then
        log_info "Scan de sécurité Go..."
        gosec -fmt json -out "$TEST_RESULTS_DIR/gosec_report.json" ./... 2>&1 | tee "$TEST_RESULTS_DIR/gosec.log"
    fi
    
    # Scan de vulnérabilités Rust
    if command -v cargo-audit >/dev/null 2>&1; then
        log_info "Scan de sécurité Rust..."
        cargo audit --json > "$TEST_RESULTS_DIR/cargo_audit.json" 2>&1 | tee "$TEST_RESULTS_DIR/cargo_audit.log"
    fi
    
    # Scan de vulnérabilités npm
    if command -v npm-audit >/dev/null 2>&1; then
        log_info "Scan de sécurité npm..."
        npm audit --json > "$TEST_RESULTS_DIR/npm_audit.json" 2>&1 | tee "$TEST_RESULTS_DIR/npm_audit.log"
    fi
    
    log_success "Tests de sécurité terminés"
}

# Fonction pour générer le rapport global
generate_report() {
    log_info "Génération du rapport global..."
    
    local report_file="$TEST_RESULTS_DIR/test_report.html"
    
    cat > "$report_file" << 'HTMLEOF'
<!DOCTYPE html>
<html lang="fr">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Rapport de Tests - Veza Platform</title>
    <style>
        body { font-family: Arial, sans-serif; margin: 20px; background-color: #f5f5f5; }
        .container { max-width: 1200px; margin: 0 auto; background: white; padding: 20px; border-radius: 8px; box-shadow: 0 2px 10px rgba(0,0,0,0.1); }
        .header { text-align: center; margin-bottom: 30px; }
        .summary { display: grid; grid-template-columns: repeat(auto-fit, minmax(200px, 1fr)); gap: 20px; margin-bottom: 30px; }
        .card { background: #f8f9fa; padding: 20px; border-radius: 8px; border-left: 4px solid #007bff; }
        .card h3 { margin: 0 0 10px 0; color: #333; }
        .card .value { font-size: 2em; font-weight: bold; color: #007bff; }
        .section { margin-bottom: 30px; }
        .section h2 { color: #333; border-bottom: 2px solid #007bff; padding-bottom: 10px; }
        .test-results { background: #f8f9fa; padding: 15px; border-radius: 8px; margin: 10px 0; }
        .success { color: #28a745; }
        .error { color: #dc3545; }
        .warning { color: #ffc107; }
        .coverage { display: grid; grid-template-columns: repeat(auto-fit, minmax(150px, 1fr)); gap: 15px; }
        .coverage-item { text-align: center; padding: 15px; background: #e9ecef; border-radius: 8px; }
        .coverage-value { font-size: 1.5em; font-weight: bold; }
        .coverage-90 { color: #28a745; }
        .coverage-70 { color: #ffc107; }
        .coverage-50 { color: #dc3545; }
    </style>
</head>
<body>
    <div class="container">
        <div class="header">
            <h1>🧪 Rapport de Tests - Veza Platform</h1>
            <p>Généré le $(date)</p>
        </div>
        
        <div class="summary">
            <div class="card">
                <h3>Tests Exécutés</h3>
                <div class="value" id="total-tests">-</div>
            </div>
            <div class="card">
                <h3>Tests Réussis</h3>
                <div class="value success" id="passed-tests">-</div>
            </div>
            <div class="card">
                <h3>Tests Échoués</h3>
                <div class="value error" id="failed-tests">-</div>
            </div>
            <div class="card">
                <h3>Couverture Moyenne</h3>
                <div class="value" id="coverage">-</div>
            </div>
        </div>
        
        <div class="section">
            <h2>📊 Couverture de Code</h2>
            <div class="coverage" id="coverage-details">
                <!-- Les détails de couverture seront ajoutés ici -->
            </div>
        </div>
        
        <div class="section">
            <h2>🔍 Résultats par Service</h2>
            <div id="service-results">
                <!-- Les résultats par service seront ajoutés ici -->
            </div>
        </div>
        
        <div class="section">
            <h2>⚡ Tests de Performance</h2>
            <div id="performance-results">
                <!-- Les résultats de performance seront ajoutés ici -->
            </div>
        </div>
        
        <div class="section">
            <h2>🔒 Tests de Sécurité</h2>
            <div id="security-results">
                <!-- Les résultats de sécurité seront ajoutés ici -->
            </div>
        </div>
    </div>
    
    <script>
        // Script pour analyser les résultats et mettre à jour le rapport
        // Ce script sera exécuté côté client pour dynamiser le rapport
    </script>
</body>
</html>
HTMLEOF

    log_success "Rapport généré: $report_file"
}

# Fonction principale
main() {
    local test_type=${1:-"all"}
    
    log_info "Démarrage du framework de tests Veza"
    log_info "Type de tests: $test_type"
    
    # Création des répertoires de résultats
    mkdir -p "$TEST_RESULTS_DIR" "$COVERAGE_DIR"
    
    # Nettoyage des résultats précédents
    rm -rf "$TEST_RESULTS_DIR"/* "$COVERAGE_DIR"/*
    
    case $test_type in
        "unit")
            log_info "Exécution des tests unitaires uniquement"
            run_go_tests "backend-api" "veza-backend-api"
            run_rust_tests "chat-server" "veza-chat-server"
            run_rust_tests "stream-server" "veza-stream-server"
            run_js_tests "frontend" "veza-frontend"
            run_js_tests "mobile" "veza-mobile"
            ;;
        "integration")
            log_info "Exécution des tests d'intégration uniquement"
            run_go_tests "backend-api" "veza-backend-api"
            run_rust_tests "chat-server" "veza-chat-server"
            run_rust_tests "stream-server" "veza-stream-server"
            ;;
        "performance")
            log_info "Exécution des tests de performance uniquement"
            run_performance_tests
            ;;
        "security")
            log_info "Exécution des tests de sécurité uniquement"
            run_security_tests
            ;;
        "all"|*)
            log_info "Exécution de tous les tests"
            run_go_tests "backend-api" "veza-backend-api"
            run_rust_tests "chat-server" "veza-chat-server"
            run_rust_tests "stream-server" "veza-stream-server"
            run_js_tests "frontend" "veza-frontend"
            run_js_tests "mobile" "veza-mobile"
            run_performance_tests
            run_security_tests
            ;;
    esac
    
    # Génération du rapport
    generate_report
    
    log_success "Framework de tests terminé!"
    log_info "Résultats disponibles dans: $TEST_RESULTS_DIR"
    log_info "Couverture disponible dans: $COVERAGE_DIR"
}

# Vérification des arguments
if [ $# -gt 1 ]; then
    echo "Usage: $0 [unit|integration|performance|security|all]"
    echo "  unit        - Tests unitaires uniquement"
    echo "  integration - Tests d'intégration uniquement"
    echo "  performance - Tests de performance uniquement"
    echo "  security    - Tests de sécurité uniquement"
    echo "  all         - Tous les tests (défaut)"
    exit 1
fi

# Exécution
main "$@"
