#!/bin/bash
# 🚀 Script d'Application des Optimisations Performance
# Usage: ./apply-performance-optimizations.sh

set -e

echo "🚀 MyRoadTrip - Application des Optimisations Performance"
echo "========================================================="
echo ""

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

# Fonction de log
log_info() {
  echo -e "${GREEN}✓${NC} $1"
}

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

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

# Vérifier qu'on est dans le bon répertoire
if [ ! -f "package.json" ]; then
  log_error "Erreur: package.json introuvable. Exécutez ce script depuis la racine du projet."
  exit 1
fi

echo "📋 Phase 1: Vérifications préliminaires"
echo "---------------------------------------"

# Type-check
echo ""
log_info "Type-checking..."
if pnpm --filter @my-roadtrip/web type-check 2>&1 | grep -q "error TS"; then
  log_warn "Des erreurs TypeScript détectées (non-bloquantes)"
else
  log_info "Type-check OK"
fi

# Lint
echo ""
log_info "Linting..."
pnpm --filter @my-roadtrip/web lint --quiet || log_warn "Quelques warnings lint (non-bloquants)"

echo ""
echo "📊 Phase 2: Analyse de l'état actuel"
echo "------------------------------------"

# Compter fichiers
TOTAL_FILES=$(find apps/web/src -name "*.vue" -o -name "*.ts" | wc -l | tr -d ' ')
log_info "Total fichiers TS/Vue: $TOTAL_FILES"

# Vérifier JSON.parse unsafe
UNSAFE_JSON=$(grep -r "JSON\.parse(" apps/web/src --include="*.ts" --include="*.vue" | grep -v "safeJson" | wc -l | tr -d ' ')
if [ "$UNSAFE_JSON" -gt 0 ]; then
  log_warn "$UNSAFE_JSON fichiers avec JSON.parse unsafe détectés"
else
  log_info "Tous les JSON.parse sont sécurisés"
fi

# Vérifier images sans lazy loading
IMAGES_NO_LAZY=$(grep -r "<img" apps/web/src --include="*.vue" | grep -v "loading=" | wc -l | tr -d ' ')
if [ "$IMAGES_NO_LAZY" -gt 0 ]; then
  log_warn "$IMAGES_NO_LAZY images sans lazy loading"
else
  log_info "Toutes les images ont lazy loading"
fi

# Vérifier virtual scroll
HAS_VIRTUAL_SCROLL=$(grep -r "useVirtualScroll" apps/web/src --include="*.vue" | wc -l | tr -d ' ')
if [ "$HAS_VIRTUAL_SCROLL" -gt 0 ]; then
  log_info "$HAS_VIRTUAL_SCROLL composants utilisent virtual scroll"
else
  log_warn "Aucun composant n'utilise virtual scroll"
fi

echo ""
echo "🛠️ Phase 3: Optimisations recommandées"
echo "--------------------------------------"

# Liste des optimisations à appliquer
echo ""
echo "1. Virtual Scroll (Priorité HAUTE)"
echo "   Cibles: LeaderboardTable.vue, DashboardPage.web.vue"
echo "   Gain: -95% render time pour listes 100+ items"
echo ""

echo "2. Optimiser Watchers (Priorité HAUTE)"
echo "   Cibles: CreateSessionDialog.vue, LiveChat.vue, JoinSessionDialog.vue"
echo "   Gain: -60% re-renders inutiles"
echo ""

echo "3. Diviser DashboardPage (Priorité HAUTE)"
echo "   3096 lignes → 5 sous-composants"
echo "   Gain: -80% taille fichier, lazy load possible"
echo ""

echo "4. Code Splitting Router (Priorité MOYENNE)"
echo "   Ajouter chunk names et prefetch"
echo "   Gain: -30% bundle initial"
echo ""

echo "5. Tree-Shaking Quasar (Priorité MOYENNE)"
echo "   Import sélectif composants"
echo "   Gain: -2MB bundle Quasar"
echo ""

echo ""
echo "🧪 Phase 4: Tests de validation"
echo "-------------------------------"

echo ""
echo "Test 1: JSON Parse Safety"
echo "  1. Corrompre localStorage: localStorage.setItem('planContext', '{invalid')"
echo "  2. Recharger app"
echo "  3. ✅ App doit continuer sans crash"
echo ""

echo "Test 2: Lazy Loading"
echo "  1. DevTools → Network → Throttle 3G"
echo "  2. Scroll Dashboard"
echo "  3. ✅ Images chargées progressivement"
echo ""

echo "Test 3: Performance Monitoring"
echo "  1. DevTools → Performance → Record 10s"
echo "  2. Vérifier FPS constant"
echo "  3. ✅ Pas de Long Tasks > 50ms"
echo ""

echo ""
echo "📊 Phase 5: Build & Analyse"
echo "--------------------------"

# Build
echo ""
log_info "Building production..."
if pnpm --filter @my-roadtrip/web build; then
  log_info "Build successful"
  
  # Taille bundle
  BUNDLE_SIZE=$(du -sh apps/web/dist | cut -f1)
  log_info "Bundle size: $BUNDLE_SIZE"
  
  # Compter chunks
  CHUNK_COUNT=$(find apps/web/dist/assets -name "*.js" | wc -l | tr -d ' ')
  log_info "JS chunks: $CHUNK_COUNT"
else
  log_error "Build failed"
  exit 1
fi

echo ""
echo "✅ Rapport Final"
echo "==============="
echo ""

# Calcul score
SCORE=0

if [ "$UNSAFE_JSON" -eq 0 ]; then
  SCORE=$((SCORE + 25))
  echo "✅ JSON.parse sécurisés: +25 points"
else
  echo "❌ JSON.parse unsafe restants: 0 points"
fi

if [ "$IMAGES_NO_LAZY" -eq 0 ]; then
  SCORE=$((SCORE + 15))
  echo "✅ Images lazy loaded: +15 points"
else
  echo "⚠️  Images sans lazy loading: 0 points"
fi

if [ "$HAS_VIRTUAL_SCROLL" -gt 0 ]; then
  SCORE=$((SCORE + 30))
  echo "✅ Virtual scroll utilisé: +30 points"
else
  echo "❌ Virtual scroll non utilisé: 0 points"
fi

# Watchers optimisés (à vérifier manuellement)
echo "⏳ Watchers optimisés: à vérifier (max +20 points)"

# Code splitting (à vérifier manuellement)
echo "⏳ Code splitting: à vérifier (max +10 points)"

echo ""
echo "Score Performance: $SCORE/100"
echo ""

if [ "$SCORE" -ge 70 ]; then
  log_info "🎉 Excellent! Performance optimale"
elif [ "$SCORE" -ge 40 ]; then
  log_warn "⚠️  Bien, mais améliorations possibles"
else
  log_error "❌ Critique: optimisations urgentes requises"
fi

echo ""
echo "📚 Prochaines étapes:"
echo "-------------------"
echo "1. Lire PERFORMANCE_OPTIMIZATION_GUIDE.md pour détails complets"
echo "2. Appliquer virtual scroll sur composants identifiés"
echo "3. Optimiser watchers avec reactiveOptimizer.ts"
echo "4. Tester en local avec pnpm dev"
echo "5. Valider avec tests ci-dessus"
echo ""

log_info "Script terminé avec succès!"
exit 0
