# apps/customers/models.py
from django.conf import settings
from django.db import models, transaction
from django.utils import timezone
from django.utils.translation import gettext_lazy as _
from apps.core.models import BaseModel, Document, AuditLog, Notification


class Customer(BaseModel):
    """
    Modèle représentant un client de base de la coopérative.
    Hérite de BaseModel pour l'audit et l'ID unique.
    """

    user = models.OneToOneField(
        settings.AUTH_USER_MODEL,
        on_delete=models.CASCADE,
        unique=True,  # Garantit l'unicité sans être une clé primaire
        related_name="customer",
        verbose_name="Utilisateur",
    )
    address = models.TextField(blank=True, verbose_name="Adresse complète")
    id_card_number = models.CharField(
        max_length=50, blank=True, verbose_name="Numéro de carte d'identité"
    )
    phone_number = models.CharField(
        max_length=30, blank=True, verbose_name="Numéro de téléphone"
    )
    birth_date = models.DateField(
        null=True, blank=True, verbose_name="Date de naissance"
    )
    identity_documents = models.ManyToManyField(
        Document, blank=True, verbose_name=_("Pièces d'identité")
    )

    def __str__(self):
        return self.user.email

    @property
    def is_member(self):
        """Retourne True si le client est aussi un membre."""
        return hasattr(self, "member")

    @transaction.atomic
    def promote_to_member(self, by_user, membership_start_date=None):
        """Promeut un client au statut de membre."""
        from apps.members.models import Member

        if self.is_member:
            raise ValueError("Ce client est déjà un membre.")

        # Avec l'héritage multi-table, nous devons "convertir" le customer existant
        # en supprimant l'entrée dans customers_customer et en créant une entrée dans members_member

        # Sauvegarder les données du customer avant suppression
        customer_data = {
            "user": self.user,
            "address": self.address,
            "id_card_number": self.id_card_number,
            "phone_number": self.phone_number,
            "birth_date": self.birth_date,
            "created_at": self.created_at,
            "updated_at": self.updated_at,
            "created_by": self.created_by,
            "updated_by": by_user,
            "is_active": self.is_active,
        }

        # Sauvegarder les relations ManyToMany
        identity_docs = list(self.identity_documents.all())

        # Supprimer le customer existant (cela va libérer la relation OneToOne avec User)
        self.delete()

        # Créer le nouveau member avec toutes les données
        member = Member.objects.create(
            **customer_data,
            membership_start_date=membership_start_date or timezone.now().date(),
            role_in_cooperative="Membre",
            membership_fee_paid=0.0,
        )

        # Restaurer les relations ManyToMany
        member.identity_documents.set(identity_docs)

        # Log d'audit
        AuditLog.objects.create(
            user=by_user,
            action_type=AuditLog.ActionType.ACTIVATION,
            content_object=member,
            description=f"Le client {member.user.email} est devenu membre.",
        )

        # Notification de bienvenue
        Notification.objects.create(
            recipient=member.user,
            title="Bienvenue parmi nos membres !",
            message="Félicitations, votre adhésion à la coopérative a été confirmée. Vous pouvez maintenant accéder à tous les services réservés aux membres.",
            notification_type=Notification.NotificationType.SUCCESS,
        )

        return member

    class Meta:
        verbose_name = "Client"
        verbose_name_plural = "Clients"
        db_table = "customers_customer"
