# apps/shares/management/commands/payment_alerts.py
from django.core.management.base import BaseCommand
from django.utils import timezone
from django.db.models import Q
from datetime import timedelta

from apps.shares.models import ShareSubscription, SharePayment
from apps.core.models import Notification
from apps.members.models import Member


class Command(BaseCommand):
    help = "Génère des alertes pour les paiements de parts sociales"

    def add_arguments(self, parser):
        parser.add_argument(
            "--overdue-days",
            type=int,
            default=30,
            help="Nombre de jours pour considérer un paiement en retard (défaut: 30)",
        )
        parser.add_argument(
            "--send-notifications",
            action="store_true",
            help="Envoie des notifications aux membres concernés",
        )
        parser.add_argument(
            "--dry-run",
            action="store_true",
            help="Mode simulation (affiche les alertes sans les envoyer)",
        )

    def handle(self, *args, **options):
        overdue_days = options["overdue_days"]
        send_notifications = options["send_notifications"]
        dry_run = options["dry_run"]

        self.stdout.write(
            self.style.SUCCESS("🚨 SYSTÈME D'ALERTES PAIEMENTS DE PARTS SOCIALES")
        )
        self.stdout.write("=" * 70)

        cutoff_date = timezone.now().date() - timedelta(days=overdue_days)

        # 1. Souscriptions non payées depuis X jours
        overdue_subscriptions = ShareSubscription.objects.filter(
            subscription_date__lt=cutoff_date,
            id__in=[
                s.id for s in ShareSubscription.objects.all() if not s.is_fully_paid
            ],
        ).order_by("subscription_date")

        if not overdue_subscriptions:
            self.stdout.write(
                self.style.SUCCESS(
                    f"✅ Aucune souscription en retard de plus de {overdue_days} jours"
                )
            )
            return

        self.stdout.write(
            f"\n⚠️  SOUSCRIPTIONS EN RETARD ({overdue_subscriptions.count()} trouvées)"
        )
        self.stdout.write("-" * 50)

        alerts_sent = 0
        total_overdue_amount = 0

        for subscription in overdue_subscriptions:
            member = subscription.member
            user = member.user

            days_overdue = (timezone.now().date() - subscription.subscription_date).days
            unpaid_quantity = (
                subscription.subscribed_quantity - subscription.paid_quantity
            )
            unpaid_amount = unpaid_quantity * subscription.share_type.nominal_value
            total_overdue_amount += unpaid_amount

            # Affichage de l'alerte
            self.stdout.write(f"\n🔴 Alerte #{subscription.id}")
            self.stdout.write(
                f"   Membre: {user.first_name} {user.last_name} ({member.membership_number})"
            )
            self.stdout.write(f"   Email: {user.email}")
            self.stdout.write(
                f"   Souscription: {subscription.subscribed_quantity} parts de {subscription.share_type.name}"
            )
            self.stdout.write(
                f"   Payé: {subscription.paid_quantity}/{subscription.subscribed_quantity} parts"
            )
            self.stdout.write(f"   Montant impayé: {unpaid_amount:,.0f} FCFA")
            self.stdout.write(f"   Retard: {days_overdue} jours")
            self.stdout.write(f"   Date souscription: {subscription.subscription_date}")

            # Envoi de notification si demandé
            if send_notifications and not dry_run:
                notification_sent = self.send_overdue_notification(
                    subscription, days_overdue, unpaid_amount
                )
                if notification_sent:
                    alerts_sent += 1
                    self.stdout.write(f"   📧 Notification envoyée")
            elif dry_run:
                self.stdout.write(f"   📧 Notification (mode simulation)")

        # 2. Résumé des alertes
        self.stdout.write(f"\n📊 RÉSUMÉ DES ALERTES")
        self.stdout.write("-" * 30)
        self.stdout.write(f"Souscriptions en retard: {overdue_subscriptions.count()}")
        self.stdout.write(f"Montant total impayé: {total_overdue_amount:,.0f} FCFA")
        if send_notifications and not dry_run:
            self.stdout.write(f"Notifications envoyées: {alerts_sent}")

        # 3. Alertes par gravité
        self.stdout.write(f"\n🎯 RÉPARTITION PAR GRAVITÉ")
        self.stdout.write("-" * 30)

        critical_subs = [
            s
            for s in overdue_subscriptions
            if (timezone.now().date() - s.subscription_date).days > 90
        ]
        warning_subs = [
            s
            for s in overdue_subscriptions
            if 60 < (timezone.now().date() - s.subscription_date).days <= 90
        ]
        normal_subs = [
            s
            for s in overdue_subscriptions
            if 30 <= (timezone.now().date() - s.subscription_date).days <= 60
        ]

        self.stdout.write(f"🔴 Critique (>90 jours): {len(critical_subs)}")
        self.stdout.write(f"🟠 Attention (60-90 jours): {len(warning_subs)}")
        self.stdout.write(f"🟡 Normal (30-60 jours): {len(normal_subs)}")

        # 4. Suggestions d'actions
        self.stdout.write(f"\n💡 SUGGESTIONS D'ACTIONS")
        self.stdout.write("-" * 30)

        if critical_subs:
            self.stdout.write("• Contacter personnellement les membres critiques")
            self.stdout.write("• Proposer des plans de paiement échelonnés")

        if warning_subs or normal_subs:
            self.stdout.write("• Envoyer des rappels par email")
            self.stdout.write("• Organiser des sessions d'information")

    def send_overdue_notification(self, subscription, days_overdue, unpaid_amount):
        """Envoie une notification de retard de paiement"""
        try:
            member = subscription.member

            # Déterminer le niveau de gravité
            if days_overdue > 90:
                title = "🔴 URGENT: Paiement de parts sociales en retard"
                priority = Notification.NotificationType.ERROR
            elif days_overdue > 60:
                title = "🟠 IMPORTANT: Rappel paiement parts sociales"
                priority = Notification.NotificationType.WARNING
            else:
                title = "🟡 Rappel: Paiement de parts sociales"
                priority = Notification.NotificationType.INFO

            message = f"""
Cher(e) {member.user.first_name} {member.user.last_name},

Votre souscription de parts sociales nécessite votre attention:

📋 Détails de la souscription:
• Type: {subscription.share_type.name}
• Quantité souscrite: {subscription.subscribed_quantity} parts
• Quantité payée: {subscription.paid_quantity} parts
• Montant restant: {unpaid_amount:,.0f} FCFA

⏰ Informations de retard:
• Date de souscription: {subscription.subscription_date.strftime('%d/%m/%Y')}
• Retard: {days_overdue} jours

💰 Pour effectuer votre paiement, contactez l'administration de la coopérative.

Cordialement,
L'équipe COOP-CA AMIFOND
            """.strip()

            Notification.objects.create(
                recipient=member.user,
                title=title,
                message=message,
                notification_type=priority,
            )

            return True

        except Exception as e:
            self.stdout.write(self.style.ERROR(f"Erreur envoi notification: {e}"))
            return False
