#!/usr/bin/env python
"""
Script de test complet pour valider l'ensemble du système AMIFOND
"""

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()

    # Imports Django
    from apps.authentication.models import User
    from apps.core.models import Document, MediaFile, SystemConfiguration, Notification
    from django.core.files.uploadedfile import SimpleUploadedFile
    from django.utils import timezone
    from io import BytesIO
    from PIL import Image

    def test_complete_workflow():
        """Test d'un workflow complet AMIFOND"""
        print("🏦 TEST DU WORKFLOW COMPLET AMIFOND")
        print("=" * 60)
        print()

        # 1. Créer un utilisateur admin
        print("1️⃣  CRÉATION D'UTILISATEUR ADMIN")
        print("-" * 40)
        
        try:
            # Nettoyer d'abord
            User.objects.filter(email='admin@amifond.com').delete()
            
            admin_user = User.objects.create_superuser(
                email="admin@amifond.com",
                password="admin123"
            )
            
            print(f"✅ Admin créé: {admin_user.email} ({admin_user.username})")
            
        except Exception as e:
            print(f"❌ Erreur création admin: {e}")
            return
        
        print()

        # 2. Configurer le système
        print("2️⃣  CONFIGURATION DU SYSTÈME")
        print("-" * 40)
        
        try:
            # Créer quelques configurations système
            configs = [
                ("COOP_NAME", "COOP-CA AMIFOND", "Nom de la coopérative"),
                ("COOP_SIRET", "12345678901234", "Numéro SIRET de la coopérative"),
                ("COOP_ADDRESS", "123 Rue de la Coopération, 75001 Paris", "Adresse de la coopérative"),
                ("EMAIL_NOTIFICATIONS", "true", "Activer les notifications par email"),
                ("MAX_FILE_SIZE_MB", "10", "Taille maximale des fichiers en MB"),
            ]
            
            for key, value, description in configs:
                config = SystemConfiguration.objects.create(
                    key=key,
                    value=value,
                    description=description,
                    created_by=admin_user
                )
                print(f"✅ Config: {key} = {value}")
            
        except Exception as e:
            print(f"❌ Erreur configuration: {e}")
        
        print()

        # 3. Créer des documents de test
        print("3️⃣  CRÉATION DE DOCUMENTS")
        print("-" * 40)
        
        try:
            # Créer un fichier texte de test
            test_content = "Ceci est un document de test pour AMIFOND"
            text_file = SimpleUploadedFile(
                "reglement-interieur.txt",
                test_content.encode('utf-8'),
                content_type="text/plain"
            )
            
            document = Document.objects.create(
                title="Règlement intérieur de la coopérative",
                description="Document officiel du règlement intérieur",
                file=text_file,
                created_by=admin_user
            )
            
            print(f"✅ Document créé: {document.title}")
            print(f"   → Fichier: {document.file.name}")
            print(f"   → URL: {document.file_url}")
            print(f"   → Stockage: {document.storage_info['type']}")
            
        except Exception as e:
            print(f"❌ Erreur création document: {e}")
        
        print()

        # 4. Créer des médias de test
        print("4️⃣  CRÉATION DE FICHIERS MÉDIA")
        print("-" * 40)
        
        try:
            # Créer une image de test
            img = Image.new('RGB', (100, 100), color='red')
            img_bytes = BytesIO()
            img.save(img_bytes, format='PNG')
            img_bytes.seek(0)
            
            image_file = SimpleUploadedFile(
                "logo-amifond.png",
                img_bytes.read(),
                content_type="image/png"
            )
            
            media = MediaFile.objects.create(
                title="Logo AMIFOND",
                description="Logo officiel de la coopérative",
                media_type="image",
                file=image_file,
                created_by=admin_user
            )
            
            print(f"✅ Média créé: {media.title}")
            print(f"   → Type: {media.get_media_type_display()}")
            print(f"   → Extension: {media.get_file_extension()}")
            print(f"   → Est image: {media.is_image()}")
            print(f"   → Taille: {media.get_file_size_formatted()}")
            print(f"   → URL originale: {media.file_url}")
            print(f"   → URL miniature: {media.thumbnail_url}")
            
        except Exception as e:
            print(f"❌ Erreur création média: {e}")
        
        print()

        # 5. Créer des notifications
        print("5️⃣  CRÉATION DE NOTIFICATIONS")
        print("-" * 40)
        
        try:
            notifications = [
                {
                    "title": "Bienvenue dans AMIFOND",
                    "message": "Votre compte administrateur a été créé avec succès.",
                    "notification_type": "success",
                    "priority": "normal"
                },
                {
                    "title": "Configuration requise", 
                    "message": "Veuillez compléter la configuration de la coopérative.",
                    "notification_type": "warning",
                    "priority": "high",
                    "action_url": "/admin/",
                    "action_text": "Accéder à l'admin"
                }
            ]
            
            for notif_data in notifications:
                notification = Notification.objects.create(
                    recipient=admin_user,
                    created_by=admin_user,
                    **notif_data
                )
                print(f"✅ Notification: {notification.title}")
                print(f"   → Type: {notification.get_notification_type_display()}")
                print(f"   → Priorité: {notification.get_priority_display()}")
                print(f"   → Lue: {notification.is_read}")
                
        except Exception as e:
            print(f"❌ Erreur création notifications: {e}")
        
        print()

        # 6. Test des fonctionnalités avancées
        print("6️⃣  TEST DES FONCTIONNALITÉS AVANCÉES")
        print("-" * 40)
        
        try:
            # Test de récupération de configuration
            coop_name = SystemConfiguration.get_value("COOP_NAME", "AMIFOND")
            print(f"✅ Configuration récupérée: COOP_NAME = {coop_name}")
            
            # Test de marquage de notification comme lue
            first_notification = Notification.objects.first()
            first_notification.mark_as_read()
            print(f"✅ Notification marquée comme lue: {first_notification.title}")
            
            # Test de soft delete
            test_doc = Document.objects.first()
            test_doc.soft_delete(user=admin_user)
            print(f"✅ Document supprimé logiquement: {test_doc.title}")
            print(f"   → Is active: {test_doc.is_active}")
            
            # Test de restauration
            test_doc.restore(user=admin_user)
            print(f"✅ Document restauré: {test_doc.title}")
            print(f"   → Is active: {test_doc.is_active}")
            
        except Exception as e:
            print(f"❌ Erreur fonctionnalités avancées: {e}")
        
        print()

        # 7. Statistiques finales
        print("7️⃣  STATISTIQUES FINALES")
        print("-" * 40)
        
        try:
            stats = {
                "Utilisateurs": User.objects.count(),
                "Utilisateurs actifs": User.objects.filter(is_active=True).count(),
                "Documents": Document.objects.count(),
                "Documents actifs": Document.active_objects.count(),
                "Fichiers média": MediaFile.objects.count(),
                "Notifications": Notification.objects.count(),
                "Notifications non lues": Notification.objects.filter(is_read=False).count(),
                "Configurations": SystemConfiguration.objects.count(),
            }
            
            print("📊 Statistiques du système:")
            for key, value in stats.items():
                print(f"   → {key}: {value}")
            
        except Exception as e:
            print(f"❌ Erreur statistiques: {e}")
        
        print()
        print("🎉 WORKFLOW COMPLET TERMINÉ AVEC SUCCÈS !")
        print("=" * 60)

    # Exécuter le test complet
    test_complete_workflow()
