import 'package:firebase_core/firebase_core.dart'; import 'package:firebase_storage/firebase_storage.dart'; import '../lib/firebase_options.dart'; /// Script de diagnostic pour analyser les images dans Firebase Storage void main() async { print('🔍 Diagnostic des images Firebase Storage'); print('========================================='); try { // Initialiser Firebase await Firebase.initializeApp( options: DefaultFirebaseOptions.currentPlatform, ); final storage = FirebaseStorage.instance; print('📂 Analyse du dossier trip_images...'); final listResult = await storage.ref('trip_images').listAll(); if (listResult.items.isEmpty) { print('❌ Aucune image trouvĂ©e dans trip_images/'); return; } print('📊 ${listResult.items.length} image(s) trouvĂ©e(s):'); print(''); final Map>> locationGroups = {}; for (int i = 0; i < listResult.items.length; i++) { final item = listResult.items[i]; final fileName = item.name; print('${i + 1}. Fichier: $fileName'); try { // RĂ©cupĂ©rer les mĂ©tadonnĂ©es final metadata = await item.getMetadata(); final customMeta = metadata.customMetadata ?? {}; final location = customMeta['location'] ?? 'Inconnue'; final normalizedLocation = customMeta['normalizedLocation'] ?? 'Non dĂ©finie'; final source = customMeta['source'] ?? 'Inconnue'; final uploadedAt = customMeta['uploadedAt'] ?? 'Inconnue'; print(' 📍 Location: $location'); print(' đŸ·ïž Normalized: $normalizedLocation'); print(' đŸ“€ Source: $source'); print(' 📅 Upload: $uploadedAt'); // RĂ©cupĂ©rer l'URL de tĂ©lĂ©chargement final downloadUrl = await item.getDownloadURL(); print(' 🔗 URL: $downloadUrl'); // Grouper par location normalisĂ©e final groupKey = normalizedLocation != 'Non dĂ©finie' ? normalizedLocation : location.toLowerCase(); if (!locationGroups.containsKey(groupKey)) { locationGroups[groupKey] = []; } locationGroups[groupKey]!.add({ 'fileName': fileName, 'location': location, 'normalizedLocation': normalizedLocation, 'uploadedAt': uploadedAt, 'downloadUrl': downloadUrl, }); } catch (e) { print(' ❌ Erreur lecture mĂ©tadonnĂ©es: $e'); // Essayer de deviner la location depuis le nom du fichier final parts = fileName.split('_'); if (parts.length >= 2) { final guessedLocation = parts.take(parts.length - 1).join('_'); print(' đŸ€” Location devinĂ©e: $guessedLocation'); if (!locationGroups.containsKey(guessedLocation)) { locationGroups[guessedLocation] = []; } locationGroups[guessedLocation]!.add({ 'fileName': fileName, 'location': 'DevinĂ©e: $guessedLocation', 'normalizedLocation': 'Non dĂ©finie', 'uploadedAt': 'Inconnue', 'downloadUrl': 'Non rĂ©cupĂ©rĂ©e', }); } } print(''); } // Analyser les doublons print('🔍 Analyse des doublons par location:'); print('===================================='); int totalDuplicates = 0; for (final entry in locationGroups.entries) { final location = entry.key; final images = entry.value; if (images.length > 1) { print('⚠ DOUBLONS dĂ©tectĂ©s pour "$location": ${images.length} images'); totalDuplicates += images.length - 1; for (int i = 0; i < images.length; i++) { final image = images[i]; print(' ${i + 1}. ${image['fileName']} (${image['uploadedAt']})'); } print(''); } else { print('✅ "$location": 1 image (OK)'); } } print('📈 RĂ©sumĂ©:'); print('- Total images: ${listResult.items.length}'); print('- Locations uniques: ${locationGroups.length}'); print('- Images en doublon: $totalDuplicates'); print('- Économie possible: ${totalDuplicates} images peuvent ĂȘtre supprimĂ©es'); if (totalDuplicates > 0) { print(''); print('💡 Suggestion: Utilisez la fonctionnalitĂ© de nettoyage pour supprimer les doublons'); } } catch (e) { print('❌ Erreur lors du diagnostic: $e'); } }