#!/usr/bin/env python
"""
Script de test pour vérifier le fonctionnement des signals Django
"""
import os
import sys
import django
from pathlib import Path
from django.conf import settings

# Configuration Django
#os.environ.setdefault("DJANGO_SETTINGS_MODULE", "config.settings")
#sys.path.append("/Users/awf/Projects/clients/COOP-CA_AMIFOND/backend")

# 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")

django.setup()

from apps.authentication.models import User
from apps.users.models import UserProfile, UserActivity
from django.db import transaction
import logging

# Configuration du logging
logging.basicConfig(level=logging.INFO)
logger = logging.getLogger(__name__)


def test_user_profile_creation_signal():
    """
    Test de création automatique du profil utilisateur via signal
    """
    print("\n" + "=" * 60)
    print("TEST SIGNAL: Création automatique de UserProfile")
    print("=" * 60)

    # Nettoyer les données de test
    test_email = "signal_test@example.com"
    User.objects.filter(email=test_email).delete()

    try:
        with transaction.atomic():
            # Créer un utilisateur
            print(f"Création d'un utilisateur: {test_email}")
            user = User.objects.create_user(
                email=test_email,
                password="test123456",
                first_name="Signal",
                last_name="Test",
            )

            print(f"✅ Utilisateur créé: {user.email} (ID: {user.id})")

            # Vérifier que le profil a été créé automatiquement
            try:
                profile = UserProfile.objects.get(user=user)
                print(f"✅ Profil créé automatiquement: {profile.id}")
                print(f"   - Date de création: {profile.created_at}")
                print(f"   - Profil complet: {profile.is_profile_complete}")

                # Vérifier l'activité loggée
                activities = UserActivity.objects.filter(
                    user=user,
                    activity_type=UserActivity.ActivityType.ACCOUNT_ACTIVATION,
                )

                if activities.exists():
                    activity = activities.first()
                    print(f"✅ Activité enregistrée: {activity.description}")
                    print(f"   - Type: {activity.activity_type}")
                    print(f"   - Succès: {activity.success}")
                    print(f"   - Metadata: {activity.metadata}")
                else:
                    print("⚠️  Aucune activité enregistrée")

                return True

            except UserProfile.DoesNotExist:
                print("❌ Échec: Profil non créé automatiquement")
                return False

    except Exception as e:
        print(f"❌ Erreur lors du test: {str(e)}")
        return False

    finally:
        # Nettoyer
        User.objects.filter(email=test_email).delete()
        print("🧹 Données de test nettoyées")


def test_multiple_users():
    """
    Test de création de plusieurs utilisateurs pour vérifier la robustesse
    """
    print("\n" + "=" * 60)
    print("TEST SIGNAL: Création multiple d'utilisateurs")
    print("=" * 60)

    test_emails = [
        "bulk_test1@example.com",
        "bulk_test2@example.com",
        "bulk_test3@example.com",
    ]

    # Nettoyer
    User.objects.filter(email__in=test_emails).delete()

    success_count = 0

    try:
        for i, email in enumerate(test_emails, 1):
            print(f"\nCréation utilisateur {i}: {email}")

            user = User.objects.create_user(
                email=email,
                password="test123456",
                first_name=f"User{i}",
                last_name="Test",
            )

            # Vérifier le profil
            try:
                profile = UserProfile.objects.get(user=user)
                print(f"✅ Profil créé pour {email}")
                success_count += 1
            except UserProfile.DoesNotExist:
                print(f"❌ Profil manquant pour {email}")

        print(f"\n📊 Résultat: {success_count}/{len(test_emails)} profils créés")
        return success_count == len(test_emails)

    except Exception as e:
        print(f"❌ Erreur: {str(e)}")
        return False

    finally:
        # Nettoyer
        User.objects.filter(email__in=test_emails).delete()
        print("🧹 Données de test nettoyées")


def test_signal_error_handling():
    """
    Test de gestion d'erreur dans les signals
    """
    print("\n" + "=" * 60)
    print("TEST SIGNAL: Gestion d'erreurs")
    print("=" * 60)

    # Ce test vérifie que même si le signal échoue,
    # l'utilisateur est quand même créé
    test_email = "error_test@example.com"
    User.objects.filter(email=test_email).delete()

    try:
        user = User.objects.create_user(email=test_email, password="test123456")

        print(f"✅ Utilisateur créé même en cas d'erreur potentielle: {user.email}")

        # Vérifier les activités d'erreur
        error_activities = UserActivity.objects.filter(user=user, success=False)

        if error_activities.exists():
            print(f"✅ Erreurs loggées: {error_activities.count()}")
            for activity in error_activities:
                print(f"   - {activity.description}")

        return True

    except Exception as e:
        print(f"❌ Erreur: {str(e)}")
        return False

    finally:
        User.objects.filter(email=test_email).delete()
        print("🧹 Données de test nettoyées")


def main():
    """
    Fonction principale de test
    """
    print("🚀 DÉMARRAGE DES TESTS DE SIGNALS DJANGO")
    print("=" * 60)

    tests = [
        ("Création automatique de profil", test_user_profile_creation_signal),
        ("Création multiple d'utilisateurs", test_multiple_users),
        ("Gestion d'erreurs", test_signal_error_handling),
    ]

    results = []

    for test_name, test_func in tests:
        try:
            result = test_func()
            results.append((test_name, result))
        except Exception as e:
            print(f"❌ Erreur dans {test_name}: {str(e)}")
            results.append((test_name, False))

    # Rapport final
    print("\n" + "=" * 60)
    print("📊 RAPPORT FINAL DES TESTS")
    print("=" * 60)

    passed = 0
    for test_name, result in results:
        status = "✅ PASSÉ" if result else "❌ ÉCHEC"
        print(f"{status}: {test_name}")
        if result:
            passed += 1

    print(f"\n🎯 Résultat global: {passed}/{len(results)} tests passés")

    if passed == len(results):
        print("🎉 TOUS LES TESTS SONT PASSÉS!")
    else:
        print("⚠️  Certains tests ont échoué")

    return passed == len(results)


if __name__ == "__main__":
    main()
