#!/usr/bin/env python
"""
Script de test pour valider le système d'authentification avec génération de username UUID
"""

import os
import sys
import django
from pathlib import Path

# Configuration de Django
if __name__ == "__main__":
    # Ajouter le répertoire du projet au Python path
    project_root = Path(__file__).parent.parent
    sys.path.insert(0, str(project_root))

    # Configurer les settings Django
    os.environ.setdefault("DJANGO_SETTINGS_MODULE", "config.settings")
    
    # Initialiser Django
    django.setup()

    # Maintenant on peut importer nos modules Django
    from apps.authentication.models import User
    from apps.authentication.managers import UserManager

    def test_username_generation():
        """Test de génération des usernames avec UUID"""
        print("👤 TEST DE GÉNÉRATION DES USERNAMES")
        print("=" * 50)
        
        test_emails = [
            "thomas.awounfouet@amifond.com",
            "marie.dubois@gmail.com", 
            "jean-philippe.martin@yahoo.fr",
            "test.user@example.org",
            "admin@amifond.com"
        ]
        
        manager = User.objects
        
        for email in test_emails:
            try:
                # Générer le username
                username = manager._generate_unique_username(email)
                print(f"✅ {email}")
                print(f"   → Username généré: {username}")
                
                # Vérifier le format (doit contenir un tiret et 8 caractères à la fin)
                parts = username.split('-')
                if len(parts) >= 2 and len(parts[-1]) == 8:
                    print(f"   → Format valide: ✅")
                else:
                    print(f"   → Format invalide: ❌")
                    
            except Exception as e:
                print(f"❌ Erreur pour {email}: {e}")
            
            print()

    def test_user_creation():
        """Test de création d'utilisateurs"""
        print("🏗️  TEST DE CRÉATION D'UTILISATEURS")
        print("=" * 50)
        
        # Nettoyer d'abord les utilisateurs de test existants
        User.objects.filter(email__contains='test').delete()
        
        test_users = [
            {
                "email": "test.admin@amifond.com",
                "password": "testpass123",
                "is_staff": True
            },
            {
                "email": "test.user@amifond.com", 
                "password": "testpass123",
                "is_staff": False
            }
        ]
        
        for user_data in test_users:
            try:
                # Créer l'utilisateur
                user = User.objects.create_user(
                    email=user_data["email"],
                    password=user_data["password"],
                    is_staff=user_data.get("is_staff", False)
                )
                
                print(f"✅ Utilisateur créé:")
                print(f"   → Email: {user.email}")
                print(f"   → Username: {user.username}")
                print(f"   → Is Staff: {user.is_staff}")
                print(f"   → Is Active: {user.is_active}")
                print(f"   → Date création: {user.date_joined}")
                
                # Vérifier que le mot de passe est correctement hashé
                if user.check_password(user_data["password"]):
                    print(f"   → Mot de passe: ✅ (correctement hashé)")
                else:
                    print(f"   → Mot de passe: ❌ (problème de hachage)")
                
            except Exception as e:
                print(f"❌ Erreur lors de la création de {user_data['email']}: {e}")
            
            print()

    def test_superuser_creation():
        """Test de création de superutilisateur"""
        print("👑 TEST DE CRÉATION DE SUPERUTILISATEUR")
        print("=" * 50)
        
        try:
            # Supprimer le superuser de test s'il existe
            User.objects.filter(email='superuser@amifond.com').delete()
            
            # Créer un superutilisateur
            superuser = User.objects.create_superuser(
                email="superuser@amifond.com",
                password="supersecret123"
            )
            
            print(f"✅ Superutilisateur créé:")
            print(f"   → Email: {superuser.email}")
            print(f"   → Username: {superuser.username}")
            print(f"   → Is Staff: {superuser.is_staff}")
            print(f"   → Is Superuser: {superuser.is_superuser}")
            print(f"   → Is Active: {superuser.is_active}")
            
        except Exception as e:
            print(f"❌ Erreur lors de la création du superutilisateur: {e}")
        
        print()

    def test_user_authentication():
        """Test d'authentification des utilisateurs"""
        print("🔐 TEST D'AUTHENTIFICATION")
        print("=" * 50)
        
        try:
            from django.contrib.auth import authenticate
            
            # Tenter d'authentifier un utilisateur existant
            test_email = "test.admin@amifond.com"
            test_password = "testpass123"
            
            user = authenticate(username=test_email, password=test_password)
            
            if user:
                print(f"✅ Authentification réussie:")
                print(f"   → User: {user.email}")
                print(f"   → Username: {user.username}")
                print(f"   → Authenticated: {user.is_authenticated}")
            else:
                print(f"❌ Authentification échouée pour {test_email}")
                
        except Exception as e:
            print(f"❌ Erreur lors de l'authentification: {e}")
        
        print()

    def test_user_stats():
        """Statistiques des utilisateurs"""
        print("📊 STATISTIQUES DES UTILISATEURS")
        print("=" * 50)
        
        try:
            total_users = User.objects.count()
            active_users = User.objects.filter(is_active=True).count()
            staff_users = User.objects.filter(is_staff=True).count()
            superusers = User.objects.filter(is_superuser=True).count()
            
            print(f"📈 Statistiques:")
            print(f"   → Total utilisateurs: {total_users}")
            print(f"   → Utilisateurs actifs: {active_users}")
            print(f"   → Staff: {staff_users}")
            print(f"   → Superutilisateurs: {superusers}")
            
            # Afficher les 5 derniers utilisateurs créés
            recent_users = User.objects.order_by('-date_joined')[:5]
            print(f"\n🕒 Derniers utilisateurs créés:")
            for user in recent_users:
                print(f"   → {user.email} ({user.username}) - {user.date_joined.strftime('%d/%m/%Y %H:%M')}")
                
        except Exception as e:
            print(f"❌ Erreur lors de la récupération des statistiques: {e}")
        
        print()

    # Exécution des tests
    def run_all_tests():
        print("🚀 DÉMARRAGE DES TESTS DU SYSTÈME D'AUTHENTIFICATION")
        print("=" * 60)
        print()
        
        test_username_generation()
        test_user_creation()
        test_superuser_creation()
        test_user_authentication()
        test_user_stats()
        
        print("🏁 TESTS TERMINÉS")
        print("=" * 60)

    run_all_tests()
