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

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):

    TIPOS_BANDEJA = [
    ('128', '128 células'),
    ('200', '200 células'),
    ('288', '288 células'),
]
    codigo_item = models.CharField(max_length=20, unique=True, blank=True, null=True)

    # Novo campo para sementes (nome popular da espécie)
    nome_especie = models.CharField("Nome Popular da Espécie", max_length=100, blank=True, null=True)

    # Campo já existente
    nome = models.CharField("Nome do Item", max_length=100,  blank=True, null=True)

    # Nome científico, opcional
   
    nome_cientifico = models.CharField("Nome Científico", max_length=255, blank=True, null=True)
    tipo_bandeja = models.CharField(max_length=3, choices=TIPOS_BANDEJA, blank=True, null=True)

    categoria = models.ForeignKey('CategoriaInsumo', on_delete=models.SET_NULL, null=True, blank=True, related_name='itens')
    quantidade = models.DecimalField("Quantidade", max_digits=12, decimal_places=3)
    unidade_medida = models.CharField(
        "Unidade de Medida",
        max_length=20,
        choices=[
            ('kg', 'Kilograma'),
            ('g', 'Gramas'),
            ('l', 'Litros'),
            ('ml', 'Mililitros'),
            ('un', 'Unidades'),
            ('sc', 'Sacos'),
        ]
    )
    localizacao = models.CharField("Local de Armazenamento", max_length=100, blank=True, null=True)
    data_validade = models.DateField("Data de Validade", blank=True, null=True)
    data_recebimento = models.DateField("Data de Recebimento/Compra", blank=True, null=True)
    data_descarte_prevista = models.DateField("Data Prevista para Descarte", blank=True, null=True)
    custo_unitario = models.DecimalField("Custo Unitário (R$)", max_digits=10, decimal_places=2, blank=True, null=True)
    custo = models.DecimalField("Valor da Compra (R$)", max_digits=10, decimal_places=2, blank=True, null=True)
    fornecedor = models.ForeignKey(FornecedoresModels, on_delete=models.SET_NULL, null=True, blank=True)
    notas = models.TextField("Observações / Notas", blank=True, null=True)

    def __str__(self):
        return self.nome_especie or self.nome or f"Item #{self.id}"

    def save(self, *args, **kwargs):
        if not self.codigo_item:
        # Busca todos os códigos válidos com padrão ITEM-XXXX
            codigos = ItemEstoque.objects.values_list('codigo_item', flat=True)
            max_num = 0
            for c in codigos:
                if c and re.match(r'^ITEM-\d{4}$', c):
                    num = int(c.split('-')[-1])
                    max_num = max(max_num, num)
            self.codigo_item = f"ITEM-{max_num + 1:04d}"
        super().save(*args, **kwargs)


    
    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)