from django.db import models

# Create your models here.

class Timespanmodel(models.Model):
    created_at = models.DateTimeField(auto_now_add=True)
    update_at = models.DateTimeField(auto_now=True)

    class Meta:
        abstract = True



class TaxGroup(Timespanmodel):
    """
    Groupe de taxation (ex: A, B, C...)
    d'après l'API e-MCF (taxGroups).
    """
    code = models.CharField(
        max_length=10,
        unique=True,
        help_text="Code du groupe de taxation (ex: 'A', 'B')."
    )
    name = models.CharField(
        max_length=100,
        help_text="Nom du groupe (ex: 'TVA 16%')."
    )
    description = models.TextField(
        blank=True,
        help_text="Description optionnelle."
    )
    tax=models.DecimalField(max_digits=5, decimal_places=2, default=0.00)
     #
    is_active = models.BooleanField(
        default=True,
        help_text="Permet de désactiver un groupe sans le supprimer."
    )

    class Meta:
        verbose_name = "Groupe de taxation"
        verbose_name_plural = "Groupes de taxation"
        ordering = ["code"]

    def __str__(self):
        return f"{self.code} - {self.name}"


class ClientType(Timespanmodel):
    """
    Type de client (ex: PP, PM, Administration...)
    d'après l'API e-MCF (clientTypes).
    """
    code = models.CharField(
        max_length=10,
        unique=True,
        help_text="Code type client (ex: 'PP', 'PM')."
    )
    name = models.CharField(
        max_length=100,
        help_text="Nom lisible du type (ex: 'Personne physique')."
    )
    description = models.TextField(
        blank=True,
        help_text="Description optionnelle."
    )
    is_active = models.BooleanField(
        default=True,
        help_text="Permet de désactiver un type sans le supprimer."
    )

    class Meta:
        verbose_name = "Type de client"
        verbose_name_plural = "Types de client"
        ordering = ["code"]

    def __str__(self):
        return f"{self.code} - {self.name}"


class ItemType(Timespanmodel):
    """
    Type d'article (ex: GOODS, SERVICES...)
    d'après l'API e-MCF (itemTypes).
    """

    

    code = models.CharField(
        max_length=20,
        unique=True,
        help_text="Code type article (ex: 'GOODS', 'SERVICE')."
    )
    name = models.CharField(
        max_length=100,
        help_text="Nom lisible (ex: 'Bien', 'Service')."
    )
    description = models.TextField(
        blank=True,
        help_text="Description optionnelle."
    )
    is_active = models.BooleanField(
        default=True,
        help_text="Permet de désactiver un type sans le supprimer."
    )

    class Meta:
        verbose_name = "Type d'article"
        verbose_name_plural = "Types d'article"
        ordering = ["code"]

    def __str__(self):
        return f"{self.code} - {self.name}"


class Client(Timespanmodel):
    """
    Client utilisé dans la facturation e-MCF.
    Correspond à la structure 'client' de l'API :
    - nif
    - name
    - contact
    - address
    - type / typeDesc
    """

    username = models.CharField(max_length=255, blank=True, null=True)
    password = models.CharField(max_length=20, blank=True, null=True)

    nif = models.CharField(
        max_length=20,
        blank=True,
        null=True,
        help_text="NIF du client (peut être vide si non renseigné)."
    )
    name = models.CharField(
        max_length=255,
        help_text="Nom / Raison sociale du client."
    )
    contact = models.CharField(
        max_length=50,
        blank=True,
        help_text="Téléphone ou autre contact."
    )
    email = models.EmailField(
        blank=True,
        null=True,
        help_text="Adresse email du client (facultatif)."
    )
    address = models.CharField(
        max_length=255,
        blank=True,
        help_text="Adresse postale du client."
    )

    client_type = models.ForeignKey(
        ClientType,
        on_delete=models.SET_NULL,
        null=True,
        blank=True,
        related_name="clients",
        help_text="Type de client (PP, PM, etc.)."
    )

    is_active = models.BooleanField(
        default=True,
        help_text="Permet de désactiver un client sans le supprimer."
    )

    class Meta:
        verbose_name = "Client"
        verbose_name_plural = "Clients"
        ordering = ["name"]

    def __str__(self):
        if self.nif:
            return f"{self.name} ({self.nif})"
        return self.name


class Pointvente_Dgi(Timespanmodel):
    nif = models.CharField(max_length=255, null=True, blank=True)
    mode_dgi = models.CharField(max_length=255, null=True, blank=True)
    isf_dgi = models.CharField(max_length=255, null=True, blank=True)
    type_dgi = models.CharField(max_length=255, null=True, blank=True)
    mode_dgi = models.CharField(max_length=255, null=True, blank=True)

    class Meta:
        abstract = True 


class Article_Dgi(Timespanmodel):
    typeart = models.ForeignKey(ItemType, on_delete=models.PROTECT, null=True, blank=True)
    taxgroup = models.ForeignKey(TaxGroup, on_delete=models.PROTECT, null=True, blank=True)

    class Meta:
        abstract = True


class Commande_Dgi(Timespanmodel):
    dateTimedgi = models.CharField(max_length=255, default="", null=True, blank=True)
    codedefdgi = models.CharField(max_length=255, default="", null=True, blank=True)
    counters = models.CharField(max_length=255, default="", null=True, blank=True)
    nim = models.CharField(max_length=255, default="", null=True, blank=True)
    qrCode = models.CharField(max_length=255, default="", null=True, blank=True)
    client = models.ForeignKey(Client, on_delete=models.CASCADE,null=True,blank=True)
    uid=models.CharField(max_length=255, default="", null=True, blank=True)

    class Meta:
        abstract = True
