#!/bin/bash
# Script pour exécuter les tests un par un et calculer la couverture totale
# Version ultra-légère pour éviter les problèmes de RAM

set +e  # Continuer même en cas d'erreur

BASE_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)"
cd "$BASE_DIR"

COVERAGE_DIR="coverage_groups"
TOTAL_COVERAGE="coverage_total.out"

# Créer le dossier pour les fichiers de couverture
mkdir -p "$COVERAGE_DIR"
rm -f "$COVERAGE_DIR"/*.out

echo "📦 Récupération de la liste des packages..."
PACKAGES=$(go list ./internal/... 2>/dev/null)
TOTAL=$(echo "$PACKAGES" | wc -l)
echo "   Total: $TOTAL packages"
echo ""

# Compteurs
SUCCESS=0
FAILED=0
NO_TESTS=0
PACKAGE_NUM=0

echo "🧪 Exécution des tests package par package..."
echo ""

for pkg in $PACKAGES; do
    PACKAGE_NUM=$((PACKAGE_NUM + 1))
    PKG_NAME=$(basename "$pkg")
    
    echo "[$PACKAGE_NUM/$TOTAL] Testing $PKG_NAME..."
    
    COVERAGE_FILE="$COVERAGE_DIR/$(echo "$pkg" | tr '/' '_').out"
    
    # Exécuter les tests pour ce package uniquement (avec timeout court)
    if timeout 30 go test -coverprofile="$COVERAGE_FILE" -short "$pkg" 2>&1 | grep -q "PASS\|FAIL\|ok\|FAIL"; then
        if [ -f "$COVERAGE_FILE" ] && [ -s "$COVERAGE_FILE" ]; then
            SUCCESS=$((SUCCESS + 1))
            echo "   ✅ OK"
        else
            # Vérifier si c'est parce qu'il n'y a pas de tests
            if go test -short "$pkg" 2>&1 | grep -q "no test files"; then
                NO_TESTS=$((NO_TESTS + 1))
                echo "   ⚠️  Pas de tests"
            else
                FAILED=$((FAILED + 1))
                echo "   ❌ Échec"
            fi
        fi
    else
        FAILED=$((FAILED + 1))
        echo "   ❌ Échec"
    fi
    
    # Nettoyer après chaque package pour libérer la mémoire
    go clean -testcache 2>/dev/null || true
    
    # Petite pause
    sleep 0.5
done

echo ""
echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━"
echo "📊 Résumé"
echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━"
echo "   ✅ Réussis: $SUCCESS"
echo "   ❌ Échoués: $FAILED"
echo "   ⚠️  Sans tests: $NO_TESTS"
echo "   📦 Total: $TOTAL"

echo ""
echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━"
echo "📊 Combinaison des fichiers de couverture..."
echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━"

# Compter les fichiers de couverture valides
COVERAGE_FILES=$(find "$COVERAGE_DIR" -name "*.out" -type f -size +0 2>/dev/null | wc -l)
echo "   Fichiers de couverture: $COVERAGE_FILES"

# Combiner tous les fichiers de couverture valides
if [ $COVERAGE_FILES -gt 0 ]; then
    echo "mode: set" > "$TOTAL_COVERAGE"
    for file in "$COVERAGE_DIR"/*.out; do
        if [ -f "$file" ] && [ -s "$file" ]; then
            # Ignorer la première ligne (mode: set) de chaque fichier
            tail -n +2 "$file" >> "$TOTAL_COVERAGE" 2>/dev/null || true
        fi
    done
    
    echo "✅ Couverture totale générée: $TOTAL_COVERAGE"
    
    # Calculer le pourcentage de couverture
    echo ""
    echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━"
    echo "📈 Statistiques de couverture"
    echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━"
    
    if [ -f "$TOTAL_COVERAGE" ] && [ -s "$TOTAL_COVERAGE" ]; then
        go tool cover -func="$TOTAL_COVERAGE" 2>/dev/null | tail -1
        echo ""
        echo "Pour voir le rapport HTML:"
        echo "  go tool cover -html=$TOTAL_COVERAGE"
    else
        echo "❌ Aucun fichier de couverture valide généré"
    fi
else
    echo "❌ Aucun fichier de couverture généré"
fi

