# apps/members/models.py
from django.db import models
from apps.customers.models import Customer


class Member(Customer):
    """
    Modèle représentant un membre de la coopérative.
    Hérite du modèle Customer et y ajoute des informations spécifiques à l'adhésion.
    """

    membership_number = models.CharField(
        max_length=20,
        unique=True,
        null=True,
        blank=True,
        verbose_name="Numéro d'adhérent",
    )
    role_in_cooperative = models.CharField(
        max_length=100, default="Membre", verbose_name="Rôle dans la coopérative"
    )
    membership_start_date = models.DateField(verbose_name="Date de début d'adhésion")
    membership_end_date = models.DateField(
        null=True, blank=True, verbose_name="Date de fin d'adhésion"
    )
    membership_fee_paid = models.DecimalField(
        max_digits=10,
        decimal_places=2,
        default=0.0,
        verbose_name="Frais d'adhésion payés",
    )

    @property
    def total_shares_subscribed(self):
        """Calcule le total des parts souscrites par le membre."""
        # Note: 'subscriptions' est le related_name de la FK dans ShareSubscription
        if hasattr(self, "subscriptions"):
            from django.db.models import Sum

            result = self.subscriptions.aggregate(total=Sum("subscribed_quantity"))[
                "total"
            ]
            return result or 0
        return 0

    @property
    def total_shares_paid(self):
        """Calcule le total des parts libérées (payées) par le membre."""
        total = 0
        if hasattr(self, "subscriptions"):
            for subscription in self.subscriptions.all():
                total += subscription.paid_quantity
        return total

    def save(self, *args, **kwargs):
        """Génère automatiquement le numéro d'adhérent s'il n'existe pas"""
        if not self.membership_number:
            # Trouve le prochain numéro disponible
            last_member = (
                Member.objects.filter(membership_number__isnull=False)
                .order_by("-membership_number")
                .first()
            )

            if last_member and last_member.membership_number:
                try:
                    last_number = int(last_member.membership_number.replace("MEM-", ""))
                    next_number = last_number + 1
                except (ValueError, AttributeError):
                    next_number = 1
            else:
                next_number = 1

            self.membership_number = f"MEM-{next_number:04d}"

        super().save(*args, **kwargs)

    def __str__(self):
        return f"Membre: {self.user.email}"

    class Meta:
        verbose_name = "Membre"
        verbose_name_plural = "Membres"
        db_table = "members_member"
