"""
Script pour renommer les fichiers avatars cool selon le format attendu par l'API
Convertit "Fun Avatar Characters (Community) (X).png" en "X.png"

Usage:
    python python/migrations/rename_cool_avatar_files.py
"""
import os
import shutil
from pathlib import Path


def rename_cool_avatars():
    """Renomme les fichiers d'avatars cool pour correspondre au format attendu"""
    
    # Chemin du dossier des avatars cool
    cool_dir = Path(__file__).resolve().parent.parent.parent / "rollerlogic-api" / "private" / "avatars" / "cool"
    backup_dir = cool_dir.parent / "cool_backup"
    
    if not cool_dir.exists():
        print(f"❌ Dossier introuvable: {cool_dir}")
        return False
    
    print("="*70)
    print("RENOMMAGE: Fichiers avatars cool")
    print("="*70)
    print(f"\n📁 Dossier: {cool_dir}")
    
    # Lister les fichiers actuels
    files = sorted([f for f in os.listdir(cool_dir) if f.endswith('.png')])
    print(f"\n📊 {len(files)} fichiers PNG trouvés")
    
    if len(files) == 0:
        print("❌ Aucun fichier PNG trouvé")
        return False
    
    # Mapping des noms actuels vers les noms attendus
    # Les codes en base sont cool_01, cool_02, etc. → fichiers attendus: 01.png, 02.png, etc.
    rename_map = {}
    
    # Trier les fichiers par ordre naturel
    sorted_files = []
    
    # D'abord le fichier sans numéro
    if "Fun Avatar Characters (Community).png" in files:
        sorted_files.append("Fun Avatar Characters (Community).png")
    
    # Puis les fichiers numérotés, triés par numéro
    numbered = []
    for f in files:
        if f.startswith("Fun Avatar Characters (Community) ("):
            # Extraire le numéro: "Fun Avatar Characters (Community) (12).png" → 12
            try:
                num = int(f.split("(")[-1].split(")")[0])
                numbered.append((num, f))
            except:
                pass
    
    # Trier par numéro et ajouter à sorted_files
    numbered.sort(key=lambda x: x[0])
    sorted_files.extend([f for _, f in numbered])
    
    # Créer le mapping: premier fichier → 01.png, deuxième → 02.png, etc.
    for i, old_name in enumerate(sorted_files, start=1):
        rename_map[old_name] = f"{i:02d}.png"
    
    print(f"\n📋 Mapping de renommage ({len(rename_map)} fichiers):")
    for old, new in list(rename_map.items())[:5]:
        print(f"   {old} → {new}")
    if len(rename_map) > 5:
        print(f"   ... et {len(rename_map) - 5} autres")
    
    # Vérifier qu'on a bien 19 fichiers à renommer
    if len(rename_map) != 19:
        print(f"\n⚠️  ATTENTION: {len(rename_map)} fichiers mappés, 19 attendus")
        response = input("Continuer quand même ? (o/N): ")
        if response.lower() != 'o':
            print("❌ Opération annulée")
            return False
    
    # Créer un backup
    print(f"\n💾 Création du backup dans: {backup_dir}")
    if backup_dir.exists():
        print("   Backup existant trouvé, suppression...")
        shutil.rmtree(backup_dir)
    
    backup_dir.mkdir(parents=True, exist_ok=True)
    
    # Copier tous les fichiers en backup
    for file in files:
        src = cool_dir / file
        dst = backup_dir / file
        shutil.copy2(src, dst)
    
    print(f"   ✅ {len(files)} fichiers sauvegardés")
    
    # Demander confirmation
    print(f"\n⚠️  ATTENTION: Cette opération va renommer {len(rename_map)} fichiers")
    print("   Un backup a été créé dans cool_backup/")
    response = input("\nContinuer avec le renommage ? (o/N): ")
    
    if response.lower() != 'o':
        print("❌ Opération annulée")
        print("   Le backup a été conservé dans cool_backup/")
        return False
    
    # Effectuer le renommage
    print(f"\n📝 Renommage en cours...")
    renamed = 0
    errors = 0
    
    for old_name, new_name in rename_map.items():
        old_path = cool_dir / old_name
        new_path = cool_dir / new_name
        
        try:
            # Vérifier que le fichier source existe
            if not old_path.exists():
                print(f"   ⚠️  Fichier introuvable: {old_name}")
                errors += 1
                continue
            
            # Vérifier que le fichier de destination n'existe pas déjà
            if new_path.exists():
                print(f"   ⚠️  Fichier destination existe déjà: {new_name}")
                errors += 1
                continue
            
            # Renommer
            os.rename(old_path, new_path)
            renamed += 1
            print(f"   ✅ {old_name} → {new_name}")
            
        except Exception as e:
            print(f"   ❌ Erreur pour {old_name}: {e}")
            errors += 1
    
    print(f"\n{'='*70}")
    print(f"✅ RENOMMAGE TERMINÉ")
    print(f"{'='*70}")
    print(f"Fichiers renommés: {renamed}")
    print(f"Erreurs: {errors}")
    print(f"Backup conservé: {backup_dir}")
    print(f"{'='*70}")
    
    # Vérification finale
    new_files = sorted([f for f in os.listdir(cool_dir) if f.endswith('.png')])
    print(f"\n🔍 Vérification finale:")
    print(f"   Fichiers PNG dans le dossier: {len(new_files)}")
    
    # Vérifier que les fichiers attendus existent
    expected = [f"{i:02d}.png" for i in range(1, 20)]  # 01.png à 19.png
    missing = [f for f in expected if f not in new_files]
    
    if missing:
        print(f"   ⚠️  Fichiers manquants: {', '.join(missing)}")
    else:
        print(f"   ✅ Tous les fichiers attendus (01.png à 19.png) sont présents!")
    
    # Afficher les 5 premiers fichiers
    print(f"\n📋 Fichiers dans le dossier (5 premiers):")
    for file in new_files[:5]:
        print(f"   - {file}")
    if len(new_files) > 5:
        print(f"   ... et {len(new_files) - 5} autres")
    
    if errors == 0 and len(missing) == 0:
        print(f"\n🎉 SUCCÈS COMPLET!")
        print(f"Les avatars cool sont maintenant au bon format.")
        print(f"L'API pourra servir les images correctement.")
    else:
        print(f"\n⚠️  Renommage terminé avec {errors} erreur(s)")
        print(f"Vérifiez les fichiers manuellement si nécessaire.")
        print(f"Le backup est disponible dans: {backup_dir}")
    
    print(f"\n💡 Si vous devez annuler:")
    print(f"   1. Supprimez tous les fichiers de {cool_dir}")
    print(f"   2. Copiez tous les fichiers de {backup_dir} vers {cool_dir}")
    
    return errors == 0


if __name__ == "__main__":
    print("="*70)
    print("RENOMMAGE: Fichiers avatars cool pour l'API")
    print("="*70)
    print()
    print("Ce script va renommer les fichiers:")
    print('  "Fun Avatar Characters (Community) (X).png" → "0X.png"')
    print('  Format attendu: 01.png, 02.png, ..., 19.png')
    print()
    
    success = rename_cool_avatars()
    
    if not success:
        print("\n❌ Renommage échoué ou annulé")
        exit(1)
    else:
        print("\n✅ Renommage réussi!")
        exit(0)
