# referencias/models.py
from django.db import models
from listas_configuracion.models import (
    UnidadMedida, ClasificacionProducto, 
    GrupoProducto, SubgrupoProducto
)
from django.utils.text import slugify
import os

def referencia_image_upload_path(instance, filename):
    # Genera una ruta de guardado para las imágenes: referencias_images/sku/filename
    sku_slug = slugify(instance.referencia.sku)
    return os.path.join('referencias_images', sku_slug, filename)

class Referencia(models.Model):
    TIPO_REFERENCIA_CHOICES = [
        ('MP', 'Materia Prima'),
        ('PP', 'Producto en Proceso'),
        ('PT', 'Producto Terminado'),
    ]
    
    SKU_ABC_CHOICES = [
        ('A', 'A - Alta prioridad'),
        ('B', 'B - Media prioridad'),
        ('C', 'C - Baja prioridad'),
    ]
    
    TIPO_ABASTECIMIENTO_CHOICES = [
        ('MTA', 'Make to Availability (Stock constante)'),
        ('MTO', 'Make to Order (Bajo pedido)'),
    ]
    
    sku = models.CharField(max_length=50, unique=True, verbose_name="SKU único")
    descripcion = models.TextField(verbose_name="Descripción completa")
    unidad = models.ForeignKey(
        UnidadMedida, 
        on_delete=models.PROTECT,
        verbose_name="Unidad de medida"
    )
    stock = models.DecimalField(
        max_digits=12,
        decimal_places=4,
        default=0,
        verbose_name="Stock disponible"
    )
    tipo = models.CharField(
        max_length=2,
        choices=TIPO_REFERENCIA_CHOICES,
        verbose_name="Tipo de referencia"
    )
    sku_abc = models.CharField(
        max_length=1,
        choices=SKU_ABC_CHOICES,
        verbose_name="Clasificación ABC"
    )
    clasificacion = models.ForeignKey(
        ClasificacionProducto,
        on_delete=models.PROTECT,
        verbose_name="Clasificación"
    )
    grupo = models.ForeignKey(
        GrupoProducto,
        on_delete=models.PROTECT,
        verbose_name="Grupo"
    )
    subgrupo = models.ForeignKey(
        SubgrupoProducto,
        on_delete=models.PROTECT,
        verbose_name="Subgrupo"
    )
    tipo_abastecimiento = models.CharField(
        max_length=3,
        choices=TIPO_ABASTECIMIENTO_CHOICES,
        verbose_name="Tipo de abastecimiento"
    )
    activo = models.BooleanField(default=True, verbose_name="Activo")
    precio_costo = models.DecimalField(
        max_digits=12,
        decimal_places=4,
        default=0,
        verbose_name="Precio de costo actual"
    )
    precio_venta_unitario = models.DecimalField(
        max_digits=12,
        decimal_places=2,
        default=0,
        verbose_name="Precio de venta unitario"
    )
    def refresh_precio_costo(self):
        # Update the import path below to the correct location of costo_desde_bom if needed
        from siip.utils import costo_desde_bom
        if self.tipo in ['PT','PP']:
            nuevo = costo_desde_bom(self)
            if nuevo and nuevo != self.precio_costo:
                self.precio_costo = nuevo
                self.save(update_fields=['precio_costo'])
    
    class Meta:
        verbose_name = 'Referencia'
        verbose_name_plural = 'Referencias'
        ordering = ['sku']
    
    def __str__(self):
        return f"{self.sku} - {self.descripcion[:50]}"
    
    @property
    def imagen_principal(self):
        """Devuelve la primera imagen asociada como principal"""
        return self.imagenes.first()

class ReferenciaImagen(models.Model):
    referencia = models.ForeignKey(
        Referencia,
        on_delete=models.CASCADE,
        related_name='imagenes',
        verbose_name="Referencia asociada"
    )
    imagen = models.ImageField(
        upload_to=referencia_image_upload_path,
        verbose_name="Archivo de imagen"
    )
    
    class Meta:
        verbose_name = 'Imagen de referencia'
        verbose_name_plural = 'Imágenes de referencias'
        indexes = [
            models.Index(fields=['referencia']),
        ]
    
    def __str__(self):
        return f"Imagen para {self.referencia.sku}"