from django.conf import settings
from django.db import models
from django.utils import timezone


class Traspaso(models.Model):
    ESTADO_BORRADOR = "borrador"
    ESTADO_PENDIENTE_SALIDA = "pendiente_salida"
    ESTADO_SALIDA_REGISTRADA = "salida_registrada"
    ESTADO_PENDIENTE_LLEGADA = "pendiente_llegada"
    ESTADO_COMPLETADO = "completado"
    ESTADO_AJUSTADO = "ajustado"
    ESTADO_DISPUTA = "disputa"

    ESTADO_CHOICES = [
        (ESTADO_BORRADOR, "Borrador"),
        (ESTADO_PENDIENTE_SALIDA, "Pendiente de salida"),
        (ESTADO_SALIDA_REGISTRADA, "Salida registrada"),
        (ESTADO_PENDIENTE_LLEGADA, "Pendiente de llegada"),
        (ESTADO_COMPLETADO, "Completado"),
        (ESTADO_AJUSTADO, "Ajustado"),
        (ESTADO_DISPUTA, "En disputa"),
    ]

    folio = models.CharField(max_length=50, unique=True, editable=False)
    origen = models.ForeignKey(
        "catalogos.Bodega",
        on_delete=models.PROTECT,
        related_name="traspasos_salida",
    )
    destino = models.ForeignKey(
        "catalogos.Bodega",
        on_delete=models.PROTECT,
        related_name="traspasos_entrada",
    )
    fecha_programada = models.DateTimeField()
    estado = models.CharField(max_length=20, choices=ESTADO_CHOICES, default=ESTADO_BORRADOR)

    peso_salida = models.DecimalField(max_digits=10, decimal_places=2, null=True, blank=True)
    peso_llegada = models.DecimalField(max_digits=10, decimal_places=2, null=True, blank=True)
    diferencia = models.DecimalField(max_digits=10, decimal_places=2, null=True, blank=True)

    firma_conductor_salida = models.TextField(blank=True)
    firma_conductor_llegada = models.TextField(blank=True)

    creado_por = models.ForeignKey(
        settings.AUTH_USER_MODEL,
        on_delete=models.SET_NULL,
        null=True,
        related_name="+",
    )
    actualizado_por = models.ForeignKey(
        settings.AUTH_USER_MODEL,
        on_delete=models.SET_NULL,
        null=True,
        related_name="+",
    )

    created_at = models.DateTimeField(auto_now_add=True)
    updated_at = models.DateTimeField(auto_now=True)

    class Meta:
        ordering = ["-id"]
        permissions = [
            ("aceptar_con_diferencia", "Puede aceptar traspasos con diferencia"),
            ("registrar_ajuste", "Puede registrar ajuste de traspaso"),
            ("abrir_disputa", "Puede abrir disputa de traspaso"),
        ]

    def save(self, *args, **kwargs):
        if not self.folio:
            last = Traspaso.objects.order_by("id").last()
            next_id = (last.id + 1) if last else 1
            self.folio = f"TR-{timezone.now().strftime('%Y%m%d')}-{next_id:04d}"
        super().save(*args, **kwargs)

    def __str__(self):
        return self.folio


class ItemTraspaso(models.Model):
    traspaso = models.ForeignKey(Traspaso, on_delete=models.CASCADE, related_name="items")
    variedad = models.ForeignKey("catalogos.Variedad", on_delete=models.PROTECT)
    boleta_referencia = models.ForeignKey(
        "boletas.Boleta",
        on_delete=models.SET_NULL,
        null=True,
        blank=True,
    )
    kilos_programados = models.DecimalField(max_digits=10, decimal_places=2)
    kilos_reales = models.DecimalField(max_digits=10, decimal_places=2, null=True, blank=True)
    created_at = models.DateTimeField(auto_now_add=True)


def foto_traspaso_upload_path(instance, filename):
    tid = instance.traspaso_id or "unknown"
    return f"traspasos/{tid}/{instance.tipo}_{filename}"


class FotoTraspaso(models.Model):
    TIPO_CARGA_SALIDA = "carga_salida"
    TIPO_DESCARGA_LLEGADA = "descarga_llegada"

    TIPO_CHOICES = [
        (TIPO_CARGA_SALIDA, "Carga en origen"),
        (TIPO_DESCARGA_LLEGADA, "Descarga en destino"),
    ]

    traspaso = models.ForeignKey(Traspaso, on_delete=models.CASCADE, related_name="fotos")
    tipo = models.CharField(max_length=20, choices=TIPO_CHOICES)
    imagen = models.ImageField(upload_to=foto_traspaso_upload_path)
    created_at = models.DateTimeField(auto_now_add=True)


class TraspasoLog(models.Model):
    traspaso = models.ForeignKey(Traspaso, on_delete=models.CASCADE, related_name="logs")
    usuario = models.ForeignKey(settings.AUTH_USER_MODEL, on_delete=models.SET_NULL, null=True)
    accion = models.CharField(max_length=50)
    detalle = models.JSONField(default=dict)
    fecha = models.DateTimeField(auto_now_add=True)

    class Meta:
        ordering = ["-id"]


class AjusteTraspaso(models.Model):
    traspaso = models.OneToOneField(Traspaso, on_delete=models.CASCADE, related_name="ajuste")
    kilos_ajustados = models.DecimalField(max_digits=10, decimal_places=2)
    motivo = models.TextField()
    aprobado_por = models.ForeignKey(settings.AUTH_USER_MODEL, on_delete=models.SET_NULL, null=True)
    created_at = models.DateTimeField(auto_now_add=True)
