"""
Modelos — App Finance (Facturación · IRT Angola · Pagos)
=========================================================
TaxBracket · Clinica · TipoCliente · Laboratorio · Imagen · Proceder ·
Invoice · Payment
Moneda: AOA (Kwanza · Kz) — 2 decimales.
"""

from decimal import Decimal

from django.conf import settings
from django.core.validators import MinValueValidator
from django.db import models
from django.utils import timezone
from django.utils.translation import gettext_lazy as _

from apps.core.models import BaseModel


# ============================================================
# TABLA IRT — Impuesto sobre Rendimento do Trabalho (Angola)
# ============================================================
class TaxBracket(BaseModel):
    """
    Configuración IRT simplificada.
    Solo nombre descriptivo y porcentaje a descontar.
    """

    nombre = models.CharField(
        _("nome"),
        max_length=200,
        help_text=_("Nome descritivo do escalão IRT."),
    )
    porciento_irt = models.DecimalField(
        _("percentagem IRT (%)"),
        max_digits=5,
        decimal_places=2,
        validators=[MinValueValidator(Decimal("0"))],
        help_text=_("Percentagem de IRT a descontar."),
    )

    class Meta:
        verbose_name = _("escalão IRT")
        verbose_name_plural = _("escalões IRT")
        ordering = ["nombre"]

    def __str__(self):
        return f"{self.nombre} — {self.porciento_irt}%"


# ============================================================
# CLÍNICA / CONSULTORIO
# ============================================================
class Clinica(BaseModel):
    """Consultorio o clínica donde se presta el servicio."""

    nombre = models.CharField(_("nome"), max_length=200)
    direccion = models.TextField(_("endereço"), blank=True)
    telefono = models.CharField(_("telefone"), max_length=30, blank=True)
    nif = models.CharField(
        _("NIF"),
        max_length=30,
        blank=True,
        help_text=_("Número de Identificação Fiscal da clínica."),
    )

    class Meta:
        verbose_name = _("clínica")
        verbose_name_plural = _("clínicas")
        ordering = ["nombre"]

    def __str__(self):
        return self.nombre


# ============================================================
# TIPO DE CLIENTE
# ============================================================
class TipoCliente(BaseModel):
    """Clasificación del tipo de cliente/paciente."""

    nombre = models.CharField(_("nome"), max_length=200)
    descripcion = models.TextField(_("descrição"), blank=True)

    class Meta:
        verbose_name = _("tipo de cliente")
        verbose_name_plural = _("tipos de cliente")
        ordering = ["nombre"]

    def __str__(self):
        return self.nombre


# ============================================================
# CATÁLOGO DE SERVICIOS MÉDICOS
# ============================================================
class _ServicioMedicoBase(BaseModel):
    """Modelo abstracto para servicios con precio y porciento médico."""

    nombre = models.CharField(_("nome"), max_length=200)
    descripcion = models.TextField(_("descrição"), blank=True)
    servicio_padre = models.ForeignKey(
        "appointments.Servicio",
        on_delete=models.SET_NULL,
        null=True,
        blank=True,
        verbose_name=_("serviço pai"),
        help_text=_("Serviço de consultas a que pertence (pai)."),
    )
    precio_venta = models.DecimalField(
        _("preço de venda (Kz)"),
        max_digits=14,
        decimal_places=2,
        validators=[MinValueValidator(Decimal("0"))],
    )
    porciento_medico = models.DecimalField(
        _("percentagem médica (%)"),
        max_digits=5,
        decimal_places=2,
        validators=[MinValueValidator(Decimal("0"))],
        help_text=_("Percentagem que corresponde à doutora."),
    )

    class Meta:
        abstract = True
        ordering = ["nombre"]

    def __str__(self):
        return f"{self.nombre} — {self.precio_venta:,.2f} Kz"


class Laboratorio(_ServicioMedicoBase):
    """Examen de laboratorio."""

    class Meta(_ServicioMedicoBase.Meta):
        verbose_name = _("laboratório")
        verbose_name_plural = _("laboratórios")


class Imagen(_ServicioMedicoBase):
    """Estudio de imagen (ecografía, rayos X, etc.)."""

    class Meta(_ServicioMedicoBase.Meta):
        verbose_name = _("imagem")
        verbose_name_plural = _("imagens")


class Proceder(_ServicioMedicoBase):
    """Procedimiento médico."""

    class Meta(_ServicioMedicoBase.Meta):
        verbose_name = _("procedimento")
        verbose_name_plural = _("procedimentos")


class ServicioMedico(_ServicioMedicoBase):
    """Servicio médico general."""

    class Meta(_ServicioMedicoBase.Meta):
        verbose_name = _("serviço médico")
        verbose_name_plural = _("serviços médicos")


class Cirugia(_ServicioMedicoBase):
    """Cirugía médica."""

    class Meta(_ServicioMedicoBase.Meta):
        verbose_name = _("cirurgia")
        verbose_name_plural = _("cirurgias")


class ControlPrenatal(_ServicioMedicoBase):
    """Servicio de control prenatal."""

    class Meta(_ServicioMedicoBase.Meta):
        verbose_name = _("controlo pré-natal")
        verbose_name_plural = _("controlos pré-natais")


class Examen(BaseModel):
    """Examen médico (sin porciento médico)."""

    nombre = models.CharField(_("nome"), max_length=200)
    descripcion = models.TextField(_("descrição"), blank=True)
    precio_venta = models.DecimalField(
        _("preço de venda (Kz)"),
        max_digits=14,
        decimal_places=2,
        validators=[MinValueValidator(Decimal("0"))],
    )

    class Meta:
        verbose_name = _("exame")
        verbose_name_plural = _("exames")
        ordering = ["nombre"]

    def __str__(self):
        return f"{self.nombre} — {self.precio_venta:,.2f} Kz"


# ============================================================
# FACTURA
# ============================================================
class Invoice(BaseModel):
    """
    Factura generada al completar una cita.
    Número correlativo por año: FAC-2024-0001.
    """

    class Estado(models.TextChoices):
        PENDIENTE = "pendiente", _("Pendente")
        PAGADO = "pagado", _("Pago")
        PAGO_PARCIAL = "pago_parcial", _("Pagamento Parcial")
        ANULADO = "anulado", _("Anulado")

    class MetodoPago(models.TextChoices):
        EFECTIVO = "efectivo", _("Numerário")
        TRANSFERENCIA = "transferencia", _("Transferência Bancária")
        MULTICAIXA = "multicaixa", _("Referência Multicaixa")

    numero = models.CharField(
        _("número"),
        max_length=20,
        unique=True,
        editable=False,
        db_index=True,
    )
    paciente = models.ForeignKey(
        settings.AUTH_USER_MODEL,
        on_delete=models.PROTECT,
        related_name="facturas",
        verbose_name=_("paciente"),
    )
    cita = models.OneToOneField(
        "appointments.Cita",
        on_delete=models.PROTECT,
        related_name="factura",
        verbose_name=_("consulta"),
    )
    servicio = models.ForeignKey(
        "appointments.Servicio",
        on_delete=models.PROTECT,
        related_name="facturas",
        verbose_name=_("serviço"),
    )
    clinica = models.ForeignKey(
        Clinica,
        on_delete=models.SET_NULL,
        null=True,
        blank=True,
        related_name="facturas",
        verbose_name=_("clínica"),
    )

    subtotal = models.DecimalField(
        _("subtotal (Kz)"),
        max_digits=14,
        decimal_places=2,
        validators=[MinValueValidator(Decimal("0"))],
    )
    irt = models.DecimalField(
        _("IRT (Kz)"),
        max_digits=14,
        decimal_places=2,
        default=Decimal("0"),
    )
    total = models.DecimalField(
        _("total (Kz)"),
        max_digits=14,
        decimal_places=2,
        validators=[MinValueValidator(Decimal("0"))],
    )

    estado = models.CharField(
        _("estado"),
        max_length=15,
        choices=Estado.choices,
        default=Estado.PENDIENTE,
        db_index=True,
    )
    metodo_pago = models.CharField(
        _("método de pagamento"),
        max_length=20,
        choices=MetodoPago.choices,
        blank=True,
    )

    notas = models.TextField(_("notas"), blank=True)
    fecha_emision = models.DateTimeField(_("data de emissão"), default=timezone.now)

    class Meta:
        verbose_name = _("fatura")
        verbose_name_plural = _("faturas")
        ordering = ["-fecha_emision"]
        indexes = [
            models.Index(fields=["-fecha_emision", "estado"], name="idx_invoice_fecha_estado"),
        ]

    def __str__(self):
        return f"{self.numero} — {self.paciente.get_full_name()} — {self.total:,.2f} Kz"

    def save(self, *args, **kwargs):
        if not self.numero:
            self.numero = self._generar_numero()
        if not self.irt and self.subtotal:
            self.irt = Decimal("0.00")
        if not self.total and self.subtotal:
            self.total = self.subtotal + self.irt
        super().save(*args, **kwargs)

    @staticmethod
    def _generar_numero():
        """
        Genera número correlativo: FAC-YYYY-NNNN.
        Usa SELECT FOR UPDATE para evitar duplicados en concurrencia.
        """
        year = timezone.now().year
        prefix = f"FAC-{year}-"
        last = (
            Invoice.objects.filter(numero__startswith=prefix)
            .order_by("-numero")
            .values_list("numero", flat=True)
            .first()
        )
        if last:
            last_seq = int(last.split("-")[-1])
            new_seq = last_seq + 1
        else:
            new_seq = 1
        return f"{prefix}{new_seq:04d}"

    @property
    def monto_pagado(self):
        """Suma de pagos activos asociados a esta factura."""
        return self.pagos.filter(is_active=True).aggregate(
            total=models.Sum("monto")
        )["total"] or Decimal("0.00")

    @property
    def saldo_pendiente(self):
        return self.total - self.monto_pagado

    def actualizar_estado(self):
        """Recalcula el estado según los pagos registrados."""
        pagado = self.monto_pagado
        if pagado >= self.total:
            self.estado = self.Estado.PAGADO
        elif pagado > 0:
            self.estado = self.Estado.PAGO_PARCIAL
        else:
            self.estado = self.Estado.PENDIENTE
        self.save(update_fields=["estado", "updated_at"])


# ============================================================
# PAGO
# ============================================================
class Payment(BaseModel):
    """Registro individual de pago contra una factura."""

    factura = models.ForeignKey(
        Invoice,
        on_delete=models.PROTECT,
        related_name="pagos",
        verbose_name=_("fatura"),
    )
    monto = models.DecimalField(
        _("monto (Kz)"),
        max_digits=14,
        decimal_places=2,
        validators=[MinValueValidator(Decimal("0.01"))],
    )
    metodo = models.CharField(
        _("método de pagamento"),
        max_length=20,
        choices=Invoice.MetodoPago.choices,
    )
    referencia = models.CharField(
        _("referência transação"),
        max_length=100,
        blank=True,
        help_text=_("Nro. de transferência, referência Multicaixa, etc."),
    )
    registrado_por = models.ForeignKey(
        settings.AUTH_USER_MODEL,
        on_delete=models.PROTECT,
        related_name="pagos_registrados",
        verbose_name=_("registado por"),
    )
    fecha = models.DateTimeField(_("data do pagamento"), default=timezone.now)

    class Meta:
        verbose_name = _("pagamento")
        verbose_name_plural = _("pagamentos")
        ordering = ["-fecha"]

    def __str__(self):
        return f"{self.factura.numero} — {self.monto:,.2f} Kz ({self.get_metodo_display()})"

    def save(self, *args, **kwargs):
        super().save(*args, **kwargs)
        # Actualizar estado de la factura automáticamente
        self.factura.actualizar_estado()


# ============================================================
# DÍA CLÍNICA — Apertura / Cierre de jornada
# ============================================================
class DiaClinica(BaseModel):
    """Registro de apertura y cierre de jornada diaria por clínica."""

    class Estado(models.TextChoices):
        ABIERTO = "abierto", _("Aberto")
        CERRADO = "cerrado", _("Fechado")

    clinica = models.ForeignKey(
        Clinica,
        on_delete=models.PROTECT,
        related_name="dias",
        verbose_name=_("clínica"),
    )
    fecha = models.DateField(_("data"), db_index=True)
    estado = models.CharField(
        _("estado"),
        max_length=10,
        choices=Estado.choices,
        default=Estado.ABIERTO,
    )
    abierto_por = models.ForeignKey(
        settings.AUTH_USER_MODEL,
        on_delete=models.PROTECT,
        related_name="dias_abiertos",
        verbose_name=_("aberto por"),
    )
    cerrado_por = models.ForeignKey(
        settings.AUTH_USER_MODEL,
        on_delete=models.PROTECT,
        null=True,
        blank=True,
        related_name="dias_cerrados",
        verbose_name=_("fechado por"),
    )
    hora_apertura = models.DateTimeField(_("hora abertura"), default=timezone.now)
    hora_cierre = models.DateTimeField(_("hora fecho"), null=True, blank=True)

    # Totales calculados al cerrar
    total_precio_venta = models.DecimalField(
        _("total preço venda (Kz)"), max_digits=14, decimal_places=2, default=Decimal("0")
    )
    total_porciento_medico = models.DecimalField(
        _("total percentagem médica (Kz)"), max_digits=14, decimal_places=2, default=Decimal("0")
    )

    class Meta:
        verbose_name = _("dia clínica")
        verbose_name_plural = _("dias clínica")
        ordering = ["-fecha"]
        constraints = [
            models.UniqueConstraint(
                fields=["clinica", "fecha"],
                condition=models.Q(is_active=True),
                name="unique_dia_clinica_fecha",
            ),
        ]

    def __str__(self):
        return f"{self.clinica.nombre} — {self.fecha:%d/%m/%Y} — {self.get_estado_display()}"


class DiaClinicaDetalle(BaseModel):
    """Línea de detalle dentro de un día de clínica."""

    dia = models.ForeignKey(
        DiaClinica,
        on_delete=models.CASCADE,
        related_name="detalles",
        verbose_name=_("dia clínica"),
    )
    numero = models.PositiveIntegerField(_("No."))
    numero_factura = models.CharField(_("fatura"), max_length=50, blank=True)
    paciente = models.ForeignKey(
        settings.AUTH_USER_MODEL,
        on_delete=models.PROTECT,
        related_name="dia_clinica_detalles",
        verbose_name=_("paciente"),
        null=True,
        blank=True,
    )
    tipo_cliente = models.ForeignKey(
        TipoCliente,
        on_delete=models.SET_NULL,
        null=True,
        blank=True,
        verbose_name=_("tipo cliente"),
    )
    servicio_medico = models.ForeignKey(
        ServicioMedico,
        on_delete=models.SET_NULL,
        null=True,
        blank=True,
        verbose_name=_("serviço médico"),
    )

    # Laboratorio
    laboratorio = models.ForeignKey(
        Laboratorio,
        on_delete=models.SET_NULL,
        null=True,
        blank=True,
        verbose_name=_("laboratório"),
    )
    laboratorio_precio = models.DecimalField(
        _("lab. preço venda"), max_digits=14, decimal_places=2, default=Decimal("0")
    )
    laboratorio_porciento = models.DecimalField(
        _("lab. % médica"), max_digits=5, decimal_places=2, default=Decimal("0")
    )

    # Imagen
    imagen = models.ForeignKey(
        Imagen,
        on_delete=models.SET_NULL,
        null=True,
        blank=True,
        verbose_name=_("imagem"),
    )
    imagen_precio = models.DecimalField(
        _("img. preço venda"), max_digits=14, decimal_places=2, default=Decimal("0")
    )
    imagen_porciento = models.DecimalField(
        _("img. % médica"), max_digits=5, decimal_places=2, default=Decimal("0")
    )

    # Proceder
    proceder = models.ForeignKey(
        Proceder,
        on_delete=models.SET_NULL,
        null=True,
        blank=True,
        verbose_name=_("procedimento"),
    )
    proceder_precio = models.DecimalField(
        _("proc. preço venda"), max_digits=14, decimal_places=2, default=Decimal("0")
    )
    proceder_porciento = models.DecimalField(
        _("proc. % médica"), max_digits=5, decimal_places=2, default=Decimal("0")
    )

    # Examen
    examen = models.ForeignKey(
        Examen,
        on_delete=models.SET_NULL,
        null=True,
        blank=True,
        verbose_name=_("exame"),
    )
    examen_precio = models.DecimalField(
        _("exame preço venda"), max_digits=14, decimal_places=2, default=Decimal("0")
    )

    class Meta:
        verbose_name = _("detalhe dia clínica")
        verbose_name_plural = _("detalhes dia clínica")
        ordering = ["numero"]

    def __str__(self):
        return f"#{self.numero} — {self.dia}"


# ============================================================
# FACTURA DÍA CLÍNICA
# ============================================================
class FacturaDia(BaseModel):
    """
    Factura generada desde el modal "Crear Factura" en el día de clínica.
    Se guarda al presionar "Agregar a Tabla" con estado 'sin_confirmar'.
    """

    class Estado(models.TextChoices):
        SIN_CONFIRMAR = "sin_confirmar", _("Sem Confirmar")
        CONFIRMADA = "confirmada", _("Confirmada")
        ANULADA = "anulada", _("Anulada")

    numero_factura = models.CharField(
        _("número da fatura"),
        max_length=50,
        blank=True,
    )
    paciente_nombre = models.CharField(
        _("nome do paciente"),
        max_length=300,
    )
    tipo_cliente = models.ForeignKey(
        TipoCliente,
        on_delete=models.SET_NULL,
        null=True,
        blank=True,
        related_name="facturas_dia",
        verbose_name=_("tipo de cliente"),
    )
    estado = models.CharField(
        _("estado"),
        max_length=15,
        choices=Estado.choices,
        default=Estado.SIN_CONFIRMAR,
        db_index=True,
    )
    precio_venta_total = models.DecimalField(
        _("preço de venda total (Kz)"),
        max_digits=14,
        decimal_places=2,
        default=Decimal("0"),
    )
    porciento_medico_total = models.DecimalField(
        _("percentagem médica total (Kz)"),
        max_digits=14,
        decimal_places=2,
        default=Decimal("0"),
    )
    irt_porciento = models.DecimalField(
        _("IRT (%)"),
        max_digits=5,
        decimal_places=2,
        default=Decimal("0"),
        help_text=_("Percentagem IRT aplicada no momento de criar a fatura."),
    )
    clinica = models.ForeignKey(
        Clinica,
        on_delete=models.PROTECT,
        related_name="facturas_dia",
        verbose_name=_("clínica"),
    )
    dia_clinica = models.ForeignKey(
        DiaClinica,
        on_delete=models.PROTECT,
        related_name="facturas",
        verbose_name=_("dia clínica"),
    )
    fecha = models.DateField(_("data"), default=timezone.now)
    observaciones = models.TextField(_("observações"), blank=True)
    cita = models.ForeignKey(
        "appointments.Cita",
        on_delete=models.SET_NULL,
        null=True,
        blank=True,
        related_name="facturas_dia",
        verbose_name=_("consulta associada"),
    )

    class Meta:
        verbose_name = _("fatura dia clínica")
        verbose_name_plural = _("faturas dia clínica")
        ordering = ["-fecha", "-created_at"]

    def __str__(self):
        return f"{self.numero_factura or 'S/N'} — {self.paciente_nombre} — {self.precio_venta_total:,.2f} Kz"

    @property
    def irt_monto(self):
        """Monto de IRT calculado: porciento_medico_total * irt_porciento / 100."""
        return (self.porciento_medico_total * self.irt_porciento / Decimal("100")).quantize(Decimal("0.01"))

    @property
    def ingreso_neto(self):
        """Ingreso neto: porciento_medico_total - irt_monto."""
        return self.porciento_medico_total - self.irt_monto


class DetalleFacturaDia(BaseModel):
    """Línea de detalle de una factura del día clínica."""

    class TipoItem(models.TextChoices):
        SERVICIO_MEDICO = "servicio_medico", _("Serviço Médico")
        LABORATORIO = "laboratorio", _("Laboratório")
        IMAGEN = "imagen", _("Imagem")
        PROCEDER = "proceder", _("Procedimento")

    factura = models.ForeignKey(
        FacturaDia,
        on_delete=models.CASCADE,
        related_name="detalles",
        verbose_name=_("fatura"),
    )
    tipo = models.CharField(
        _("tipo de item"),
        max_length=20,
        choices=TipoItem.choices,
    )
    nombre_item = models.CharField(
        _("nome do item"),
        max_length=300,
    )
    precio_venta = models.DecimalField(
        _("preço de venda (Kz)"),
        max_digits=14,
        decimal_places=2,
        default=Decimal("0"),
    )
    porciento_medico = models.DecimalField(
        _("percentagem médica (%)"),
        max_digits=5,
        decimal_places=2,
        default=Decimal("0"),
    )
    subtotal_medico = models.DecimalField(
        _("subtotal médico (Kz)"),
        max_digits=14,
        decimal_places=2,
        default=Decimal("0"),
        help_text=_("precio_venta × porciento_medico / 100"),
    )
    irt_porciento = models.DecimalField(
        _("IRT (%)"),
        max_digits=5,
        decimal_places=2,
        default=Decimal("0"),
    )
    irt_monto = models.DecimalField(
        _("IRT monto (Kz)"),
        max_digits=14,
        decimal_places=2,
        default=Decimal("0"),
        help_text=_("subtotal_medico × irt_porciento / 100"),
    )

    class Meta:
        verbose_name = _("detalhe fatura dia")
        verbose_name_plural = _("detalhes fatura dia")
        ordering = ["tipo", "created_at"]

    def __str__(self):
        return f"{self.get_tipo_display()}: {self.nombre_item} — {self.precio_venta:,.2f} Kz"


# ============================================================
# CIERRE DEL DÍA — Resultados globales + Detalle por factura
# ============================================================
class CierreDia(BaseModel):
    """Registro de cierre del día con resultados globales para una clínica."""

    dia_clinica = models.OneToOneField(
        DiaClinica,
        on_delete=models.PROTECT,
        related_name="cierre",
        verbose_name=_("dia clínica"),
    )
    clinica = models.ForeignKey(
        Clinica,
        on_delete=models.PROTECT,
        related_name="cierres",
        verbose_name=_("clínica"),
    )
    fecha = models.DateField(_("data"), db_index=True)
    cerrado_por = models.ForeignKey(
        settings.AUTH_USER_MODEL,
        on_delete=models.PROTECT,
        related_name="cierres_realizados",
        verbose_name=_("fechado por"),
    )
    hora_cierre = models.DateTimeField(_("hora de fecho"), default=timezone.now)

    total_facturas = models.PositiveIntegerField(_("total faturas"), default=0)
    total_precio_venta = models.DecimalField(
        _("total preço venda (Kz)"), max_digits=14, decimal_places=2, default=Decimal("0")
    )
    total_porciento_medico = models.DecimalField(
        _("total % médica (Kz)"), max_digits=14, decimal_places=2, default=Decimal("0")
    )
    total_irt_porciento = models.DecimalField(
        _("IRT (%)"), max_digits=5, decimal_places=2, default=Decimal("0")
    )
    total_irt_monto = models.DecimalField(
        _("total IRT (Kz)"), max_digits=14, decimal_places=2, default=Decimal("0")
    )
    total_ingreso_neto = models.DecimalField(
        _("total receita líquida (Kz)"), max_digits=14, decimal_places=2, default=Decimal("0")
    )

    class Meta:
        verbose_name = _("fecho do dia")
        verbose_name_plural = _("fechos do dia")
        ordering = ["-fecha"]

    def __str__(self):
        return f"Cierre {self.clinica.nombre} — {self.fecha:%d/%m/%Y} — {self.total_ingreso_neto:,.2f} Kz"


class DetalleCierreDia(BaseModel):
    """Snapshot de cada factura al momento del cierre del día."""

    cierre = models.ForeignKey(
        CierreDia,
        on_delete=models.CASCADE,
        related_name="detalles",
        verbose_name=_("fecho do dia"),
    )
    factura_dia = models.ForeignKey(
        FacturaDia,
        on_delete=models.PROTECT,
        related_name="detalle_cierre",
        verbose_name=_("fatura dia"),
    )
    numero_factura = models.CharField(_("número da fatura"), max_length=50, blank=True)
    paciente_nombre = models.CharField(_("paciente"), max_length=300)
    tipo_cliente_nombre = models.CharField(_("tipo cliente"), max_length=200, blank=True)
    precio_venta_total = models.DecimalField(
        _("preço venda total (Kz)"), max_digits=14, decimal_places=2, default=Decimal("0")
    )
    porciento_medico_total = models.DecimalField(
        _("% médica total (Kz)"), max_digits=14, decimal_places=2, default=Decimal("0")
    )
    irt_porciento = models.DecimalField(
        _("IRT (%)"), max_digits=5, decimal_places=2, default=Decimal("0")
    )
    irt_monto = models.DecimalField(
        _("IRT monto (Kz)"), max_digits=14, decimal_places=2, default=Decimal("0")
    )
    ingreso_neto = models.DecimalField(
        _("receita líquida (Kz)"), max_digits=14, decimal_places=2, default=Decimal("0")
    )
    observaciones = models.TextField(_("observações"), blank=True)

    class Meta:
        verbose_name = _("detalhe fecho do dia")
        verbose_name_plural = _("detalhes fecho do dia")
        ordering = ["created_at"]

    def __str__(self):
        return f"{self.numero_factura or 'S/N'} — {self.paciente_nombre} — {self.ingreso_neto:,.2f} Kz"


# ============================================================
# AUDITORÍA DÍA CLÍNICA — Trazabilidad de acciones
# ============================================================
class AuditoriaDia(BaseModel):
    """Registro de auditoría para acciones realizadas en un día de clínica."""

    class Accion(models.TextChoices):
        ABRIR_DIA = "abrir_dia", _("Abrir Dia")
        CERRAR_DIA = "cerrar_dia", _("Fechar Dia")
        REABRIR_DIA = "reabrir_dia", _("Reabrir Dia")
        CREAR_FACTURA = "crear_factura", _("Criar Fatura")
        ELIMINAR_FACTURA = "eliminar_factura", _("Eliminar Fatura")
        CREAR_INGRESO_EXTRA = "crear_ingreso_extra", _("Criar Receita Extra")
        ELIMINAR_INGRESO_EXTRA = "eliminar_ingreso_extra", _("Eliminar Receita Extra")

    dia_clinica = models.ForeignKey(
        DiaClinica,
        on_delete=models.CASCADE,
        related_name="auditoria",
        verbose_name=_("dia clínica"),
    )
    accion = models.CharField(
        _("ação"),
        max_length=30,
        choices=Accion.choices,
    )
    usuario = models.ForeignKey(
        settings.AUTH_USER_MODEL,
        on_delete=models.PROTECT,
        related_name="auditoria_dias",
        verbose_name=_("utilizador"),
    )
    detalle = models.TextField(
        _("detalhe"),
        blank=True,
        help_text=_("Descrição da ação realizada."),
    )
    fecha_hora = models.DateTimeField(_("data e hora"), default=timezone.now)

    class Meta:
        verbose_name = _("auditoria dia clínica")
        verbose_name_plural = _("auditorias dia clínica")
        ordering = ["-fecha_hora"]

    def __str__(self):
        return f"{self.get_accion_display()} — {self.dia_clinica} — {self.usuario}"


# ============================================================
# INGRESO EXTRA — Ingreso neto sin IRT ni % médico
# ============================================================
class IngresoExtra(BaseModel):
    """Ingreso extra registrado en un día de clínica. No lleva IRT ni % médico."""

    dia_clinica = models.ForeignKey(
        DiaClinica,
        on_delete=models.CASCADE,
        related_name="ingresos_extra",
        verbose_name=_("dia clínica"),
    )
    monto = models.DecimalField(
        _("montante (Kz)"),
        max_digits=14,
        decimal_places=2,
        validators=[MinValueValidator(Decimal("0.01"))],
    )
    motivo = models.CharField(
        _("motivo"),
        max_length=500,
        help_text=_("Descrição da receita extra."),
    )
    registrado_por = models.ForeignKey(
        settings.AUTH_USER_MODEL,
        on_delete=models.PROTECT,
        related_name="ingresos_extra_registrados",
        verbose_name=_("registado por"),
    )

    class Meta:
        verbose_name = _("receita extra")
        verbose_name_plural = _("receitas extra")
        ordering = ["created_at"]

    def __str__(self):
        return f"Ingreso Extra — {self.monto:,.2f} Kz — {self.motivo[:50]}"
