from django.db import models

class UnidadMedida(models.Model):
    """
    Lista de unidades de medida configurables por el usuario
    Ejemplos: Kilogramos (kg), Litros (lt), Unidades (ud)
    """
    TIPOS_UNIDAD = [
        ('peso', 'Peso'),
        ('longitud', 'Longitud'),
        ('volumen', 'Volumen'),
        ('unidad', 'Unidad'),
    ]
    
    nombre = models.CharField(max_length=50, unique=True, verbose_name="Nombre completo")
    abreviatura = models.CharField(max_length=10, unique=True, verbose_name="Abreviatura")
    tipo = models.CharField(
        max_length=10, 
        choices=TIPOS_UNIDAD, 
        verbose_name="Tipo de unidad"
    )
    
    class Meta:
        verbose_name = 'Unidad de Medida'
        verbose_name_plural = 'Unidades de Medida'
        ordering = ['nombre']
        db_table = 'listas_unidades_medida'
    
    def __str__(self):
        return f"{self.nombre} ({self.abreviatura})"

class FormaPago(models.Model):
    """
    Lista de formas de pago configurables por el usuario
    Ejemplos: Contado, Crédito 30 días, Crédito 60 días
    """
    nombre = models.CharField(
        max_length=50, 
        unique=True, 
        verbose_name="Nombre de la forma de pago"
    )
    plazo_dias = models.PositiveIntegerField(
        default=0,
        verbose_name="Plazo en días"
    )
    descripcion = models.TextField(
        blank=True, 
        null=True,
        verbose_name="Descripción adicional"
    )
    
    class Meta:
        verbose_name = 'Forma de Pago'
        verbose_name_plural = 'Formas de Pago'
        ordering = ['plazo_dias', 'nombre']
        db_table = 'listas_formas_pago'
    
    def __str__(self):
        if self.plazo_dias > 0:
            return f"{self.nombre} (Crédito {self.plazo_dias} días)"
        return f"{self.nombre} (Contado)"

class EmpaqueCompra(models.Model):
    """
    Lista de tipos de empaque para compras configurables por el usuario
    Ejemplos: Rollo, Caja, Bulto 50kg
    """
    nombre = models.CharField(
        max_length=100, 
        unique=True,
        verbose_name="Tipo de empaque"
    )
    descripcion = models.TextField(
        blank=True, 
        null=True,
        verbose_name="Descripción del empaque"
    )
    
    class Meta:
        verbose_name = 'Empaque para Compras'
        verbose_name_plural = 'Empaques para Compras'
        db_table = 'listas_empaques_compra'
    
    def __str__(self):
        return self.nombre

class EmpaqueProduccion(models.Model):
    """
    Lista de tipos de empaque para producción configurables por el usuario
    Ejemplos: Lote, Rollo, Paquete
    """
    nombre = models.CharField(
        max_length=100, 
        unique=True,
        verbose_name="Tipo de empaque"
    )
    descripcion = models.TextField(
        blank=True, 
        null=True,
        verbose_name="Descripción del empaque"
    )
    
    class Meta:
        verbose_name = 'Empaque para Producción'
        verbose_name_plural = 'Empaques para Producción'
        db_table = 'listas_empaques_produccion'
    
    def __str__(self):
        return self.nombre

class ClasificacionProducto(models.Model):
    """
    Lista de clasificaciones de productos configurables por el usuario
    Ejemplos: Packs, Colores, Plásticos
    """
    nombre = models.CharField(
        max_length=100, 
        unique=True,
        verbose_name="Nombre de la clasificación"
    )
    
    class Meta:
        verbose_name = 'Clasificación de Producto'
        verbose_name_plural = 'Clasificaciones de Productos'
        ordering = ['nombre']
        db_table = 'listas_clasificaciones_producto'
    
    def __str__(self):
        return self.nombre

class GrupoProducto(models.Model):
    """
    Lista de grupos de productos configurables por el usuario
    Ejemplos: Granel, Jumbo, Éxito
    """
    nombre = models.CharField(
        max_length=100, 
        unique=True,
        verbose_name="Nombre del grupo"
    )
    
    class Meta:
        verbose_name = 'Grupo de Producto'
        verbose_name_plural = 'Grupos de Productos'
        ordering = ['nombre']
        db_table = 'listas_grupos_producto'
    
    def __str__(self):
        return self.nombre

class SubgrupoProducto(models.Model):
    """
    Lista de subgrupos de productos configurables por el usuario
    Ejemplos: Importados, Nacionales (pertenecientes a un grupo)
    """
    grupo = models.ForeignKey(
        GrupoProducto, 
        on_delete=models.CASCADE, 
        related_name='subgrupos',
        verbose_name="Grupo padre"
    )
    nombre = models.CharField(
        max_length=100,
        verbose_name="Nombre del subgrupo"
    )
    
    class Meta:
        verbose_name = 'Subgrupo de Producto'
        verbose_name_plural = 'Subgrupos de Productos'
        ordering = ['grupo', 'nombre']
        constraints = [
            models.UniqueConstraint(
                fields=['grupo', 'nombre'], 
                name='unique_subgrupo_por_grupo'
            )
        ]
        db_table = 'listas_subgrupos_producto'
    
    def __str__(self):
        return f"{self.grupo} > {self.nombre}"