#!/usr/bin/env python
"""
Script de test pour les modèles de l'application users
Teste la création et les fonctionnalités des modèles UserProfile, IdentityDocument, UserActivity et UserSession
"""

import os
import sys
import django
from datetime import date, timedelta

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

from django.contrib.auth import get_user_model
from django.utils import timezone
from apps.users.models import UserProfile, IdentityDocument, UserActivity, UserSession
from apps.users.utils import (
    parse_user_agent,
    format_phone_number,
    validate_phone_number,
)

User = get_user_model()


def test_user_creation():
    """Test de création d'utilisateur avec profil"""
    print("🧪 Test de création d'utilisateur avec profil...")

    # Créer un utilisateur
    user = User.objects.create_user(
        email="test.amifond@example.com", password="motdepasse123"
    )

    print(f"✅ Utilisateur créé: {user.email} (Username: {user.username})")

    # Créer un profil
    profile = UserProfile.objects.create(
        user=user,
        first_name="Jean",
        last_name="Dupont",
        middle_name="Marie",
        gender=UserProfile.Gender.MALE,
        date_of_birth=date(1985, 5, 15),
        place_of_birth="Douala, Cameroun",
        civil_status=UserProfile.CivilStatus.MARRIED,
        nationality="Camerounaise",
        phone_number="+237690123456",
        address_line_1="123 Rue de la Paix",
        city="Douala",
        country="Cameroun",
        occupation="Ingénieur informatique",
        employer="TechCorp SARL",
        education_level=UserProfile.EducationLevel.UNIVERSITY,
        monthly_income=500000,  # 500,000 FCFA
        emergency_contact_name="Marie Dupont",
        emergency_contact_relationship="Épouse",
        emergency_contact_phone="+237690654321",
        preferred_language="fr",
        bio="Passionné de technologie et de coopératives",
    )

    print(f"✅ Profil créé: {profile.get_full_name}")
    print(f"   📧 Email: {profile.user.email}")
    print(f"   📱 Téléphone: {profile.phone_number}")
    print(f"   🎂 Âge: {profile.age} ans")
    print(f"   📍 Adresse: {profile.full_address}")
    print(f"   📊 Completion: {profile.get_completion_percentage()}%")
    print(f"   🖼️ Avatar URL: {profile.avatar_url}")

    return user, profile


def test_identity_document():
    """Test de création de document d'identité"""
    print("\n🧪 Test de création de document d'identité...")

    user = User.objects.first()
    if not user:
        print("❌ Aucun utilisateur trouvé, créer d'abord un utilisateur")
        return

    # Créer un document d'identité
    document = IdentityDocument.objects.create(
        user=user,
        document_type=IdentityDocument.DocumentType.ID_CARD,
        document_number="123456789",
        issue_date=date(2020, 1, 15),
        expiry_date=date(2030, 1, 15),
        issuing_authority="Ministère de l'Administration Territoriale",
    )

    print(f"✅ Document créé: {document}")
    print(f"   📄 Type: {document.get_document_type_display()}")
    print(f"   🔢 Numéro: {document.document_number}")
    print(f"   ⏰ Expire dans: {document.days_until_expiry} jours")
    print(f"   ✅ Vérifié: {'Oui' if document.is_verified else 'Non'}")
    print(f"   📁 URL: {document.document_url}")

    # Vérifier le document
    admin_user = User.objects.filter(is_staff=True).first()
    if admin_user:
        document.verify_document(admin_user)
        print(f"   ✅ Document vérifié par: {admin_user.email}")

    return document


def test_user_activity():
    """Test de journalisation d'activité"""
    print("\n🧪 Test de journalisation d'activité...")

    user = User.objects.first()
    if not user:
        print("❌ Aucun utilisateur trouvé")
        return

    # Logger différentes activités
    activities = [
        {
            "activity_type": UserActivity.ActivityType.LOGIN,
            "description": "Connexion depuis l'application mobile",
            "ip_address": "192.168.1.100",
            "user_agent": "Mozilla/5.0 (iPhone; CPU iPhone OS 14_0 like Mac OS X) AppleWebKit/605.1.15",
            "success": True,
        },
        {
            "activity_type": UserActivity.ActivityType.PROFILE_UPDATE,
            "description": "Mise à jour du numéro de téléphone",
            "ip_address": "192.168.1.100",
            "success": True,
        },
        {
            "activity_type": UserActivity.ActivityType.DOCUMENT_UPLOAD,
            "description": "Upload de la carte d'identité",
            "ip_address": "192.168.1.100",
            "success": True,
        },
    ]

    for activity_data in activities:
        activity = UserActivity.log_activity(user=user, **activity_data)

        print(f"✅ Activité loggée: {activity.get_activity_type_display()}")
        print(f"   📝 Description: {activity.description}")
        print(f"   🌐 IP: {activity.ip_address}")
        print(f"   ⏰ Date: {activity.created_at}")
        print(f"   ✅ Succès: {'Oui' if activity.success else 'Non'}")

    # Afficher les dernières activités
    recent_activities = UserActivity.objects.filter(user=user)[:5]
    print(f"\n📊 Dernières activités de {user.email}:")
    for activity in recent_activities:
        print(f"   • {activity.get_activity_type_display()} - {activity.created_at}")


def test_user_session():
    """Test de gestion des sessions"""
    print("\n🧪 Test de gestion des sessions...")

    user = User.objects.first()
    if not user:
        print("❌ Aucun utilisateur trouvé")
        return

    # Créer une session
    session = UserSession.create_session(
        user=user,
        session_key="test_session_123456789",
        ip_address="192.168.1.100",
        user_agent="Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36",
    )

    print(f"✅ Session créée: {session}")
    print(f"   🔑 Clé: {session.session_key}")
    print(f"   🌐 IP: {session.ip_address}")
    print(f"   🖥️ Appareil: {session.device_type}")
    print(f"   🌍 Navigateur: {session.browser}")
    print(f"   ⏰ Dernière activité: {session.last_activity}")
    print(f"   ✅ Active: {'Oui' if session.is_current_session else 'Non'}")
    print(f"   ⏱️ Durée: {session.duration} minutes")

    # Créer une autre session (mobile)
    mobile_session = UserSession.create_session(
        user=user,
        session_key="mobile_session_987654321",
        ip_address="192.168.1.101",
        user_agent="Mozilla/5.0 (iPhone; CPU iPhone OS 14_0 like Mac OS X) AppleWebKit/605.1.15",
    )

    print(f"\n✅ Session mobile créée: {mobile_session.device_type}")

    # Afficher toutes les sessions actives
    active_sessions = UserSession.get_active_sessions_for_user(user)
    print(f"\n📱 Sessions actives pour {user.email}: {active_sessions.count()}")
    for session in active_sessions:
        print(
            f"   • {session.device_type} ({session.browser}) - IP: {session.ip_address}"
        )

    return session


def test_utility_functions():
    """Test des fonctions utilitaires"""
    print("\n🧪 Test des fonctions utilitaires...")

    # Test de validation de numéro de téléphone
    phone_numbers = [
        "+237690123456",  # Valide international
        "237690123456",  # Valide sans +
        "690123456",  # Valide local
        "+33123456789",  # Valide international (France)
        "123456",  # Invalide
        "",  # Vide
    ]

    print("📱 Test de validation des numéros de téléphone:")
    for phone in phone_numbers:
        is_valid = validate_phone_number(phone)
        formatted = format_phone_number(phone)
        print(f"   {phone:<15} → {'✅' if is_valid else '❌'} → {formatted}")

    # Test de parsing user agent
    user_agents = [
        "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36",
        "Mozilla/5.0 (iPhone; CPU iPhone OS 14_0 like Mac OS X) AppleWebKit/605.1.15",
        "Mozilla/5.0 (iPad; CPU OS 14_0 like Mac OS X) AppleWebKit/605.1.15",
        "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36",
    ]

    print("\n🖥️ Test de parsing user agent:")
    for ua in user_agents:
        parsed = parse_user_agent(ua)
        print(
            f"   {parsed['device_type']:<10} | {parsed['browser']:<10} | {ua[:50]}..."
        )


def test_profile_completion():
    """Test du pourcentage de completion du profil"""
    print("\n🧪 Test du pourcentage de completion du profil...")

    # Chercher un utilisateur avec un profil
    profile = UserProfile.objects.first()
    if not profile:
        print("❌ Aucun profil trouvé")
        return

    completion = profile.get_completion_percentage()

    print(f"📊 Profil de {profile.get_full_name}: {completion}% complété")

    # Obtenir des conseils pour améliorer le profil
    from apps.users.utils import get_profile_completion_tips

    tips = get_profile_completion_tips(profile)

    if tips:
        print("💡 Conseils pour améliorer le profil:")
        for tip in tips:
            print(f"   • {tip}")
    else:
        print("✅ Profil entièrement complété!")


def main():
    """Fonction principale de test"""
    print("🚀 Démarrage des tests des modèles Users...")
    print("=" * 60)

    try:
        # Tests
        user, profile = test_user_creation()
        test_identity_document()
        test_user_activity()
        test_user_session()
        test_utility_functions()
        test_profile_completion()

        print("\n" + "=" * 60)
        print("✅ Tous les tests sont passés avec succès!")

        # Statistiques finales
        print(f"\n📊 Statistiques:")
        print(f"   👥 Utilisateurs: {User.objects.count()}")
        print(f"   📋 Profils: {UserProfile.objects.count()}")
        print(f"   📄 Documents: {IdentityDocument.objects.count()}")
        print(f"   📝 Activités: {UserActivity.objects.count()}")
        print(f"   📱 Sessions: {UserSession.objects.count()}")

        # Informations sur le stockage
        from apps.core.storage_backend import get_storage_info

        storage_info = get_storage_info()
        print(f"\n💾 Stockage: {storage_info['type'].upper()}")

    except Exception as e:
        print(f"❌ Erreur lors du test: {e}")
        import traceback

        traceback.print_exc()


if __name__ == "__main__":
    main()
