# distribucion/models.py
from django.db import models
from listas_configuracion.models import UnidadMedida
from referencias.models import Referencia

class EmpaqueDistribucion(models.Model):
    nombre = models.CharField(max_length=100, verbose_name="Nombre del empaque")
    descripcion = models.TextField(verbose_name="Descripción")
    referencia = models.ForeignKey(
        Referencia,
        on_delete=models.CASCADE,
        limit_choices_to={'tipo': 'PT'},
        related_name='empaques_distribucion'
    )
    unidades_por_empaque = models.PositiveIntegerField(
        verbose_name="Unidades por empaque"
    )
    unidad_medida_longitud = models.ForeignKey(
        UnidadMedida,
        on_delete=models.PROTECT,
        limit_choices_to={'tipo': 'longitud'},
        related_name='empaques_longitud'
    )
    unidad_medida_peso = models.ForeignKey(
        UnidadMedida,
        on_delete=models.PROTECT,
        limit_choices_to={'tipo': 'peso'},
        related_name='empaques_peso'
    )
    unidad_medida_volumen = models.ForeignKey(
        UnidadMedida,
        on_delete=models.PROTECT,
        limit_choices_to={'tipo': 'volumen'},
        related_name='empaques_volumen'
    )
    largo = models.DecimalField(
        max_digits=10, 
        decimal_places=2,
        verbose_name="Largo"
    )
    ancho = models.DecimalField(
        max_digits=10, 
        decimal_places=2,
        verbose_name="Ancho"
    )
    alto = models.DecimalField(
        max_digits=10, 
        decimal_places=2,
        verbose_name="Alto"
    )
    volumen = models.DecimalField(
        max_digits=10, 
        decimal_places=2,
        verbose_name="Volumen",
        editable=False
    )
    peso_empaque_lleno = models.DecimalField(
        max_digits=10, 
        decimal_places=2,
        verbose_name="Peso empaque lleno"
    )
    niveles_maximos_estiba = models.PositiveIntegerField(
        verbose_name="Niveles máximos a apilar"
    )
    empaques_por_nivel = models.PositiveIntegerField(
        verbose_name="Empaques por nivel de estiba"
    )
    altura_optima = models.DecimalField(
        max_digits=10, 
        decimal_places=2,
        verbose_name="Altura óptima",
        editable=False
    )
    items_por_estiba = models.PositiveIntegerField(
        verbose_name="Ítems por estiva",
        editable=False
    )
    peso_estiva_completa = models.DecimalField(
        max_digits=10, 
        decimal_places=2,
        verbose_name="Peso por estiva completa",
        editable=False
    )
    volumen_estiva = models.DecimalField(
        max_digits=10, 
        decimal_places=2,
        verbose_name="Volumen por estiva",
        editable=False
    )
    LEAN_CHOICES = [
        ('lean', 'Lean'),
        ('no_lean', 'No Lean'),
    ]

    empaque_lean = models.CharField(
        max_length=10,
        choices=LEAN_CHOICES,
        default='no_lean',
        verbose_name="¿Es empaque lean?"
    )

    simbolo = models.ImageField(
        upload_to='simbolos_empaque/',
        null=True,
        blank=True,
        verbose_name="Símbolo del empaque"
    )

    class Meta:
        verbose_name = 'Empaque de Distribución'
        verbose_name_plural = 'Empaques de Distribución'
    
    def save(self, *args, **kwargs):
        # Cálculos automáticos
        self.volumen = self.largo * self.ancho * self.alto
        self.altura_optima = self.alto * self.niveles_maximos_estiba
        self.items_por_estiba = (
            self.unidades_por_empaque * 
            self.empaques_por_nivel * 
            self.niveles_maximos_estiba
        )
        self.peso_estiva_completa = (
            self.peso_empaque_lleno * 
            self.empaques_por_nivel * 
            self.niveles_maximos_estiba
        )
        self.volumen_estiva = (
            self.volumen * 
            self.empaques_por_nivel * 
            self.niveles_maximos_estiba
        )
        super().save(*args, **kwargs)
    
    def __str__(self):
        return f"{self.nombre} para {self.referencia}"