#!/bin/bash
# Script pour exécuter les tests par groupes et calculer la couverture totale

set -e

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

# Nombre de packages par groupe (réduit pour éviter les problèmes de RAM)
GROUP_SIZE=3
COVERAGE_DIR="coverage_groups"
TOTAL_COVERAGE="coverage_total.out"

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

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

# Diviser en groupes
GROUP_NUM=1
CURRENT_GROUP=0
CURRENT_PACKAGES=""

echo ""
echo "🧪 Exécution des tests par groupes de $GROUP_SIZE packages..."

for pkg in $PACKAGES; do
    CURRENT_PACKAGES="$CURRENT_PACKAGES $pkg"
    CURRENT_GROUP=$((CURRENT_GROUP + 1))
    
    if [ $CURRENT_GROUP -ge $GROUP_SIZE ]; then
        echo ""
        echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━"
        echo "📦 Groupe $GROUP_NUM ($CURRENT_GROUP packages)"
        echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━"
        
        COVERAGE_FILE="$COVERAGE_DIR/group_${GROUP_NUM}.out"
        
        # Exécuter les tests pour ce groupe (avec timeout et limite mémoire)
        if timeout 60 go test -coverprofile="$COVERAGE_FILE" -short $CURRENT_PACKAGES 2>&1; then
            echo "✅ Groupe $GROUP_NUM terminé"
            if [ -f "$COVERAGE_FILE" ]; then
                LINES=$(wc -l < "$COVERAGE_FILE")
                echo "   Couverture: $LINES lignes"
            fi
        else
            echo "⚠️  Groupe $GROUP_NUM a des échecs (continuons...)"
        fi
        
        GROUP_NUM=$((GROUP_NUM + 1))
        CURRENT_GROUP=0
        CURRENT_PACKAGES=""
        
        # Pause plus longue pour libérer la mémoire
        sleep 2
        
        # Nettoyer la mémoire Go si possible
        go clean -cache -testcache 2>/dev/null || true
    fi
done

# Traiter le dernier groupe s'il reste des packages
if [ $CURRENT_GROUP -gt 0 ]; then
    echo ""
    echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━"
    echo "📦 Groupe $GROUP_NUM ($CURRENT_GROUP packages)"
    echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━"
    
    COVERAGE_FILE="$COVERAGE_DIR/group_${GROUP_NUM}.out"
    
    if timeout 60 go test -coverprofile="$COVERAGE_FILE" -short $CURRENT_PACKAGES 2>&1; then
        echo "✅ Groupe $GROUP_NUM terminé"
        if [ -f "$COVERAGE_FILE" ]; then
            LINES=$(wc -l < "$COVERAGE_FILE")
            echo "   Couverture: $LINES lignes"
        fi
    else
        echo "⚠️  Groupe $GROUP_NUM a des échecs"
    fi
fi

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

# Combiner tous les fichiers de couverture
echo "mode: set" > "$TOTAL_COVERAGE"
for file in "$COVERAGE_DIR"/group_*.out; do
    if [ -f "$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" ]; then
    go tool cover -func="$TOTAL_COVERAGE" | tail -1
    echo ""
    echo "Pour voir le rapport HTML:"
    echo "  go tool cover -html=$TOTAL_COVERAGE"
else
    echo "❌ Aucun fichier de couverture généré"
fi


