from django.db import models


class TauxDeChange(models.Model):
    """Taux de change CDF/USD enregistré dans l'admin (X CDF pour 1 USD). Utilisé pour afficher les factures en USD si la facture n'a pas son propre taux."""
    libelle = models.CharField("Libellé", max_length=100, blank=True)
    taux = models.DecimalField("Taux (CDF pour 1 USD)", max_digits=14, decimal_places=6)
    date_taux = models.DateField("Date du taux", null=True, blank=True)
    actif = models.BooleanField("Taux par défaut", default=False, help_text="Utilisé quand la facture n'a pas de taux renseigné")

    class Meta:
        verbose_name = "Taux de change"
        verbose_name_plural = "Taux de change"
        ordering = ["-date_taux", "-id"]

    def __str__(self):
        return f"{self.taux} CDF/1 USD" + (f" ({self.libelle})" if self.libelle else "")

    def save(self, *args, **kwargs):
        if self.actif:
            TauxDeChange.objects.filter(actif=True).exclude(pk=self.pk).update(actif=False)
        super().save(*args, **kwargs)


class ClientType(models.Model):
    """Type de client (saisi dans l'admin, proposé dans le formulaire d'extraction)."""
    nom = models.CharField("Libellé", max_length=80)
    ordre = models.PositiveSmallIntegerField("Ordre d'affichage", default=0)

    class Meta:
        verbose_name = "Type de client"
        verbose_name_plural = "Types de client"
        ordering = ["ordre", "nom"]

    def __str__(self):
        return self.nom


class NormalizedInvoice(models.Model):
    """Facture extraite d'un fichier PDF ou image (entête = société + client saisis, lignes = extraites)."""
    # Source / déduplication
    source_filename = models.CharField(max_length=255, blank=True, null=True)
    source_sha1 = models.CharField(max_length=40, unique=True)
    source_file = models.FileField(upload_to="extract/invoices/", blank=True, null=True)

    # Liaison entête (société + client saisis par l'utilisateur)
    societe = models.ForeignKey(
        "normalisee.Societe",
        on_delete=models.SET_NULL,
        null=True,
        blank=True,
        related_name="extracted_invoices",
    )

    # Client (saisi)
    client_type = models.CharField("Client - Type", max_length=50, blank=True)  # <-- AJOUT
    client_nom = models.CharField("Client - Nom / Raison sociale", max_length=200, blank=True)
    client_nif = models.CharField("Client - NIF", max_length=30, blank=True)
    client_telephone = models.CharField("Client - Téléphone", max_length=30, blank=True)
    client_adresse = models.TextField("Client - Adresse", blank=True)

    # Données extraites du fichier
    invoice_type = models.CharField(max_length=80, blank=True, null=True)
    invoice_number = models.CharField(max_length=80, blank=True, null=True)
    code_def_dgi = models.CharField(max_length=120, blank=True, null=True)
    def_nid = models.CharField(max_length=60, blank=True, null=True)
    def_compteurs = models.CharField(max_length=60, blank=True, null=True)
    def_datetime = models.CharField(max_length=30, blank=True, null=True)

    nb_articles = models.PositiveIntegerField(blank=True, null=True)
    ht_taxable_16 = models.DecimalField(max_digits=14, decimal_places=2, blank=True, null=True)
    tva_16 = models.DecimalField(max_digits=14, decimal_places=2, blank=True, null=True)
    total_ttc_cdf = models.DecimalField(max_digits=14, decimal_places=2, blank=True, null=True)
    payment_mode = models.CharField(max_length=40, blank=True, null=True)
    total_ttc_usd = models.DecimalField(max_digits=14, decimal_places=2, blank=True, null=True)
    exchange_rate = models.DecimalField(max_digits=14, decimal_places=6, blank=True, null=True)
    exchange_rate_date = models.CharField(max_length=10, blank=True, null=True)
    isf = models.CharField(max_length=80, blank=True, null=True)
    qr_raw = models.TextField(blank=True, null=True)

    created_at = models.DateTimeField(auto_now_add=True)

    class Meta:
        verbose_name = "Facture extraite"
        verbose_name_plural = "Factures extraites"
        ordering = ["-created_at"]

    def __str__(self):
        return f"{self.invoice_type or 'FACTURE'} #{self.invoice_number or self.id}"


class NormalizedInvoiceLine(models.Model):
    """Ligne extraite d'une facture (PDF/image)."""
    invoice = models.ForeignKey(
        NormalizedInvoice, related_name="lines", on_delete=models.CASCADE
    )
    designation = models.CharField("Désignation", max_length=255)
    unit_price_ttc = models.DecimalField(max_digits=14, decimal_places=2, blank=True, null=True)
    quantity = models.DecimalField(max_digits=14, decimal_places=3, blank=True, null=True)
    amount_ttc = models.DecimalField(max_digits=14, decimal_places=2, blank=True, null=True)

    class Meta:
        verbose_name = "Ligne facture extraite"
        verbose_name_plural = "Lignes factures extraites"

    def __str__(self):
        return self.designation
