from django.db import models
from apps.fornecedores.models import FornecedoresModels
from django.utils import timezone
from django.contrib.auth.models import User

class CategoriaInsumo(models.Model):
    nome = models.CharField(max_length=100, unique=True)
    descricao = models.TextField(blank=True, null=True)

    def __str__(self):
        return self.nome
    
class ItemEstoque(models.Model):
    nome = models.CharField(max_length=100)
    categoria = models.ForeignKey(CategoriaInsumo, on_delete=models.SET_NULL, null=True, blank=True, related_name='itens')
    quantidade = models.DecimalField(max_digits=12, decimal_places=3)
    unidade_medida = models.CharField(
        max_length=20,
        choices=[
            ('kg', 'Kilograma'),
            ('l', 'Litros'),
            ('un', 'Unidades'),
            # Adicione outras unidades conforme necessário
        ]
    )
    localizacao = models.CharField(max_length=100, blank=True, null=True)
    data_validade = models.DateField(blank=True, null=True)
    fornecedor = models.ForeignKey(FornecedoresModels, on_delete=models.SET_NULL, null=True, blank=True)
    custo_unitario = models.DecimalField(max_digits=10, decimal_places=2, blank=True, null=True)
    notas = models.TextField(blank=True, null=True)

    def __str__(self):
        return self.nome
    
    def atualizar_quantidade(self, quantidade, tipo):
        if tipo == 'entrada':
            self.quantidade += quantidade
        elif tipo == 'saida':
            if self.quantidade >= quantidade:
                self.quantidade -= quantidade
            else:
                raise ValueError("Quantidade insuficiente em estoque para saída.")
        self.save()
    

# Novo modelo MovimentacaoEstoque
class MovimentacaoEstoque(models.Model):
    TIPO_MOVIMENTACAO = (
        ('entrada', 'Entrada'),
        ('saida', 'Saída'),
    )

    item = models.ForeignKey(ItemEstoque, on_delete=models.CASCADE)
    quantidade = models.DecimalField(max_digits=12, decimal_places=3)
    tipo = models.CharField(max_length=7, choices=TIPO_MOVIMENTACAO)
    data = models.DateTimeField(default=timezone.now)
    responsavel = models.ForeignKey(User, on_delete=models.SET_NULL, null=True)
    observacoes = models.TextField(blank=True, null=True)

    def __str__(self):
        return f"{self.tipo.capitalize()} de {self.quantidade} {self.item.unidade_medida} de {self.item.nome}"

    def save(self, *args, **kwargs):
        # Atualiza a quantidade do item antes de salvar a movimentação
        if self.pk is None:  # Apenas na criação
            if self.tipo == 'entrada':
                self.item.quantidade += self.quantidade
            elif self.tipo == 'saida':
                if self.item.quantidade >= self.quantidade:
                    self.item.quantidade -= self.quantidade
                else:
                    raise ValueError("Quantidade insuficiente em estoque para saída.")
            self.item.save()
        super(MovimentacaoEstoque, self).save(*args, **kwargs)