"""
Modelos — App Notifications
==============================
Log de mensajes WhatsApp para auditoría y diagnóstico.
"""

from django.conf import settings
from django.db import models

from apps.core.models import BaseModel


class WhatsAppLog(BaseModel):
    """Registro de cada mensaje WhatsApp enviado o intentado."""

    class Evento(models.TextChoices):
        CITA_CONFIRMADA = "cita_confirmada", "Consulta Confirmada"
        RECORDATORIO_24H = "recordatorio_24h", "Lembrete 24h"
        CITA_CANCELADA = "cita_cancelada", "Consulta Cancelada"
        FACTURA_DISPONIBLE = "factura_disponible", "Fatura Disponível"

    class Estado(models.TextChoices):
        ENVIADO = "enviado", "Enviado"
        ERROR = "error", "Erro"
        REINTENTANDO = "reintentando", "Tentando novamente"
        DESCARTADO = "descartado", "Descartado"

    destinatario = models.ForeignKey(
        settings.AUTH_USER_MODEL,
        on_delete=models.SET_NULL,
        null=True,
        blank=True,
        related_name="whatsapp_logs",
    )
    numero_telefono = models.CharField(max_length=20)
    evento = models.CharField(max_length=25, choices=Evento.choices)
    estado = models.CharField(
        max_length=15,
        choices=Estado.choices,
        default=Estado.REINTENTANDO,
    )
    mensaje_template = models.CharField(
        max_length=100,
        blank=True,
        default="",
        help_text="Nombre del template de Meta usado",
    )
    mensaje_params = models.JSONField(
        default=dict,
        blank=True,
        help_text="Parámetros enviados al template",
    )
    whatsapp_message_id = models.CharField(
        max_length=100,
        blank=True,
        default="",
        help_text="ID de mensaje retornado por la API de Meta",
    )
    intentos = models.PositiveSmallIntegerField(default=0)
    error_detalle = models.TextField(blank=True, default="")

    # Relaciones opcionales para trazabilidad
    cita = models.ForeignKey(
        "appointments.Cita",
        on_delete=models.SET_NULL,
        null=True,
        blank=True,
        related_name="whatsapp_logs",
    )
    factura = models.ForeignKey(
        "finance.Invoice",
        on_delete=models.SET_NULL,
        null=True,
        blank=True,
        related_name="whatsapp_logs",
    )

    class Meta:
        verbose_name = "Log WhatsApp"
        verbose_name_plural = "Logs WhatsApp"
        ordering = ["-created_at"]
        indexes = [
            models.Index(fields=["evento", "-created_at"]),
            models.Index(fields=["estado", "-created_at"]),
            models.Index(fields=["numero_telefono"]),
        ]

    def __str__(self):
        return f"{self.get_evento_display()} → {self.numero_telefono} [{self.get_estado_display()}]"
