# fabricacion/models.py
from django.db import models
from listas_configuracion.models import EmpaqueProduccion
from referencias.models import Referencia
from lista_de_materiales.models import ListaMateriales
from referencias.models import Referencia
from django.contrib.auth import get_user_model
from django.core.exceptions import ValidationError  
from django.utils import timezone
from datetime import timedelta

User = get_user_model()

class PlantaProduccion(models.Model):
    nombre = models.CharField(max_length=100, unique=True, verbose_name="Nombre de planta")
    direccion = models.TextField(verbose_name="Dirección")
    contacto_produccion = models.CharField(max_length=100, verbose_name="Contacto producción")
    telefono_contacto = models.CharField(max_length=20, verbose_name="Teléfono contacto")
    email_contacto = models.EmailField(verbose_name="Email contacto")
    activo = models.BooleanField(default=True, verbose_name="Activo")
    
    class Meta:
        verbose_name = 'Planta de Producción'
        verbose_name_plural = 'Plantas de Producción'
        ordering = ['nombre']
    
    def __str__(self):
        return self.nombre

class Maquina(models.Model):
    planta = models.ForeignKey(
        PlantaProduccion,
        on_delete=models.CASCADE,
        related_name='maquinas'
    )
    nombre = models.CharField(max_length=100, verbose_name="Nombre de máquina")
    tiempo_configuracion = models.PositiveIntegerField(
        verbose_name="Tiempo para poner operativa (horas)"
    )
    periodo_mantenimiento = models.PositiveIntegerField(
        verbose_name="Período entre mantenimientos (días)"
    )
    activa = models.BooleanField(default=True, verbose_name="Activa")
    
    class Meta:
        verbose_name = 'Máquina'
        verbose_name_plural = 'Máquinas'
        ordering = ['planta', 'nombre']
        unique_together = ('planta', 'nombre')
    
    def __str__(self):
        return f"{self.planta} - {self.nombre}"

# fabricacion/models.py (actualización del modelo MaquinaReferencia)
class MaquinaReferencia(models.Model):
    maquina = models.ForeignKey(
        Maquina, 
        on_delete=models.CASCADE,
        related_name='referencias_maquina'
    )
    referencia = models.ForeignKey(
        Referencia, 
        on_delete=models.CASCADE,
        related_name='maquinas_referencia'
    )
    lead_time_generar_orden = models.PositiveIntegerField(
        verbose_name="Lead time generar orden (Minutos)"
    )
    lead_time_produccion = models.PositiveIntegerField(
        verbose_name="Lead time producción (Minutos)"
    )
    lead_time_total = models.PositiveIntegerField(
        verbose_name="Lead time total (Minutos)",
        editable=False
    )
    minimo_unidades = models.PositiveIntegerField(
        verbose_name="Mínimo unidades por lote"
    )
    empaque = models.ForeignKey(
        EmpaqueProduccion,
        on_delete=models.PROTECT,
        verbose_name="Empaque de producción"
    )
    unidades_por_empaque = models.PositiveIntegerField(
        verbose_name="Unidades por empaque"
    )
    unidades_por_minuto = models.DecimalField(
        max_digits=10,
        decimal_places=2,
        verbose_name="Unidades producidas por minuto",

    )
    
    class Meta:
        verbose_name = 'Relación Máquina-Referencia'
        verbose_name_plural = 'Relaciones Máquina-Referencia'
        unique_together = ('maquina', 'referencia')
    
    def save(self, *args, **kwargs):
        self.lead_time_total = self.lead_time_generar_orden + self.lead_time_produccion
        super().save(*args, **kwargs)
    
    def __str__(self):
        return f"{self.maquina} → {self.referencia} (Velocidad: {self.unidades_por_minuto}/min)"
    
    # Añadir este método a la clase MaquinaReferencia
    def tiempo_estimado_produccion(self, cantidad):
        """
        Calcula el tiempo estimado para producir X unidades (en minutos)
        """
        if self.unidades_por_minuto <= 0:
            return 0
        return round(cantidad / self.unidades_por_minuto, 2)
    
class Mantenimiento(models.Model):
    maquina = models.ForeignKey(
        Maquina,
        on_delete=models.CASCADE,
        related_name='mantenimientos'
    )
    concepto = models.TextField(verbose_name="Concepto del mantenimiento")
    tiempo_mantenimiento = models.PositiveIntegerField(
        verbose_name="Tiempo estimado (horas)"
    )
    fecha_programada = models.DateField(verbose_name="Fecha programada")
    realizado = models.BooleanField(default=False, verbose_name="Realizado")
    fecha_realizacion = models.DateField(
        null=True, 
        blank=True,
        verbose_name="Fecha de realización"
    )
    
    class Meta:
        verbose_name = 'Mantenimiento'
        verbose_name_plural = 'Mantenimientos'
        ordering = ['fecha_programada']
    
    def __str__(self):
        return f"Mantenimiento {self.maquina} - {self.fecha_programada}"

class Reparacion(models.Model):
    maquina = models.ForeignKey(
        Maquina,
        on_delete=models.CASCADE,
        related_name='reparaciones'
    )
    concepto = models.TextField(verbose_name="Concepto de la reparación")
    tiempo_arreglo = models.PositiveIntegerField(verbose_name="Tiempo empleado (horas)")
    fecha_reparacion = models.DateField(verbose_name="Fecha de reparación")
    observaciones = models.TextField(
        blank=True,
        verbose_name="Observaciones adicionales"
    )
    
    class Meta:
        verbose_name = 'Reparación'
        verbose_name_plural = 'Reparaciones'
        ordering = ['-fecha_reparacion']
    
    def __str__(self):
        return f"Reparación {self.maquina} - {self.fecha_reparacion}"
    