#!/bin/bash
# Script autonome E2E - Gère tout de A à Z sans freeze
# Timeout strict sur CHAQUE commande

set -e

TIMEOUT=90  # Timeout global en secondes
LOG_FILE="/tmp/e2e-auto-test-$(date +%s).log"
SERVER_PID=""

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

log() {
    echo -e "${BLUE}[$(date +%H:%M:%S)]${NC} $1" | tee -a "$LOG_FILE"
}

success() {
    echo -e "${GREEN}✅ $1${NC}" | tee -a "$LOG_FILE"
}

error() {
    echo -e "${RED}❌ $1${NC}" | tee -a "$LOG_FILE"
}

warning() {
    echo -e "${YELLOW}⚠️  $1${NC}" | tee -a "$LOG_FILE"
}

# Fonction pour exécuter avec timeout strict
run_with_timeout() {
    local timeout=$1
    shift
    local cmd="$@"
    
    log "Executing: $cmd (timeout: ${timeout}s)"
    
    # Lance la commande en arrière-plan
    eval "$cmd" >> "$LOG_FILE" 2>&1 &
    local pid=$!
    
    # Attente avec timeout
    local count=0
    while kill -0 $pid 2>/dev/null; do
        if [ $count -ge $timeout ]; then
            error "Timeout atteint (${timeout}s) - Kill process $pid"
            kill -9 $pid 2>/dev/null || true
            sleep 1
            return 124  # Code timeout
        fi
        sleep 1
        ((count++))
        
        # Affiche progression tous les 5s
        if [ $((count % 5)) -eq 0 ]; then
            echo -n "."
        fi
    done
    echo ""
    
    # Récupère le code de sortie
    wait $pid 2>/dev/null
    return $?
}

# Nettoyage à la sortie
cleanup() {
    log "Nettoyage..."
    if [ -n "$SERVER_PID" ] && kill -0 $SERVER_PID 2>/dev/null; then
        log "Arrêt du serveur (PID: $SERVER_PID)"
        kill $SERVER_PID 2>/dev/null || true
        sleep 2
        kill -9 $SERVER_PID 2>/dev/null || true
    fi
    
    # Kill tous les processus vite/node qui pourraient trainer
    pkill -9 -f "vite.*e2e" 2>/dev/null || true
    pkill -9 -f "playwright" 2>/dev/null || true
    
    log "Log complet: $LOG_FILE"
}

trap cleanup EXIT INT TERM

echo ""
echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━"
echo "   🚀 Test E2E Autonome - Dashboard CRUD"
echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━"
echo ""

# 1. Validation de la config
log "1️⃣  Validation de la configuration..."
if [ -f "validate-e2e-config.sh" ]; then
    bash validate-e2e-config.sh >> "$LOG_FILE" 2>&1
    if [ $? -eq 0 ]; then
        success "Configuration validée"
    else
        error "Configuration invalide"
        exit 1
    fi
else
    warning "validate-e2e-config.sh non trouvé, skip"
fi

# 2. Nettoyage des processus existants
log "2️⃣  Nettoyage des processus existants..."
pkill -9 -f "vite.*e2e" 2>/dev/null || true
pkill -9 -f "playwright" 2>/dev/null || true
sleep 2
success "Processus nettoyés"

# 3. Démarrage du serveur
log "3️⃣  Démarrage du serveur en mode e2e..."
pnpm --filter @my-roadtrip/web dev -- --mode e2e > /tmp/vite-server.log 2>&1 &
SERVER_PID=$!
log "Serveur démarré (PID: $SERVER_PID)"

# 4. Attente serveur ready (max 30s)
log "4️⃣  Attente serveur prêt (max 30s)..."
SERVER_READY=0
for i in {1..30}; do
    # Utilise nc (netcat) au lieu de curl pour éviter les freeze
    if nc -z localhost 5173 2>/dev/null; then
        success "Serveur prêt! (${i}s)"
        SERVER_READY=1
        break
    fi
    
    if [ $i -eq 30 ]; then
        error "Serveur non prêt après 30s"
        echo "Logs serveur:"
        tail -30 /tmp/vite-server.log
        exit 1
    fi
    
    # Vérifie que le serveur tourne toujours
    if ! kill -0 $SERVER_PID 2>/dev/null; then
        error "Le serveur a crashé"
        tail -30 /tmp/vite-server.log
        exit 1
    fi
    
    sleep 1
    echo -n "."
done
echo ""

# Double check avec un vrai test HTTP si nc a réussi
if [ $SERVER_READY -eq 1 ]; then
    log "Vérification HTTP finale..."
    sleep 2  # Laisse le serveur finir de s'initialiser
fi

# 5. Type check rapide (max 20s)
log "5️⃣  Type check (max 20s)..."
if run_with_timeout 20 "pnpm type-check"; then
    success "Type check OK"
else
    warning "Type check failed ou timeout (non bloquant)"
fi

# 6. Lancement des tests (max 60s)
log "6️⃣  Lancement tests dashboard (max 60s)..."
echo ""

TEST_OUTPUT="/tmp/playwright-test-output.txt"

if run_with_timeout 60 "pnpm exec playwright test dashboard-crud.spec.ts --project=chromium --workers=1 --reporter=line" > "$TEST_OUTPUT" 2>&1; then
    success "Tests PASSED! ✨"
    echo ""
    echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━"
    echo "   📊 Résultats des tests"
    echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━"
    cat "$TEST_OUTPUT" | grep -E "passed|failed|test|✓|✗|Tests:" || cat "$TEST_OUTPUT" | tail -20
    echo ""
    success "Tous les tests sont passés!"
    EXIT_CODE=0
else
    EXIT_CODE=$?
    if [ $EXIT_CODE -eq 124 ]; then
        error "Tests TIMEOUT après 60s"
    else
        error "Tests FAILED"
    fi
    echo ""
    echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━"
    echo "   📊 Output des tests (dernières 30 lignes)"
    echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━"
    tail -30 "$TEST_OUTPUT"
    echo ""
fi

# 7. Résumé final
echo ""
echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━"
echo "   📋 Résumé"
echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━"
log "Durée totale: $SECONDS secondes"
log "Log complet: $LOG_FILE"
log "Test output: $TEST_OUTPUT"
log "Server log: /tmp/vite-server.log"

if [ $EXIT_CODE -eq 0 ]; then
    echo ""
    success "🎉 SUCCÈS - Tous les tests sont passés!"
else
    echo ""
    error "ÉCHEC - Des tests ont échoué ou timeout"
    echo ""
    echo "Pour debug:"
    echo "  - cat $LOG_FILE"
    echo "  - cat $TEST_OUTPUT"
    echo "  - cat /tmp/vite-server.log"
fi

echo ""

exit $EXIT_CODE
