# apps/metas/models.py

from django.db import models
from datetime import datetime
from django.contrib.auth import get_user_model
from apps.especies.models import Especies  # Ajuste se estiver em outro lugar
from django.db.models import Sum
from django.utils import timezone  # Utilize timezone para compatibilidade com configurações de fuso horário

User = get_user_model()

class MetasModels(models.Model):
    TIPO_META_CHOICES = [
        ('semeadura', 'Semeadura'),
        ('repique', 'Repique'),
        ('selecao_estufa', 'Seleção/Estufa'),
    ]

    STATUS_EM_ANDAMENTO = 'em_andamento'
    STATUS_FINALIZADA_COMPLETA = 'finalizada_completa'
    STATUS_FINALIZADA_INCOMPLETA = 'finalizada_incompleta'

    STATUS_CHOICES = [
        (STATUS_EM_ANDAMENTO, 'Em andamento'),
        (STATUS_FINALIZADA_COMPLETA, 'Finalizada completa'),
        (STATUS_FINALIZADA_INCOMPLETA, 'Finalizada incompleta'),
    ]

    especie = models.ForeignKey(Especies, on_delete=models.CASCADE, null=False, blank=False)
    tipo_meta = models.CharField(max_length=50, choices=TIPO_META_CHOICES, default='semeadura')
    quantidade = models.PositiveIntegerField(default=0, null=False, blank=False)

    data_inicial = models.DateField(null=False, blank=False)
    data_final = models.DateField(null=False, blank=False)

    criado_por = models.ForeignKey(User, on_delete=models.SET_NULL, null=True, blank=True)

    data_criacao = models.DateTimeField(default=datetime.now, null=False, blank=False)
    data_atualizacao = models.DateTimeField(default=datetime.now, null=False, blank=False)

    status = models.CharField(
        max_length=30,
        choices=STATUS_CHOICES,
        default=STATUS_EM_ANDAMENTO,
    )

    finalizado = models.BooleanField(default=False)

    objects = models.Manager()

    def __str__(self):
        return f"[Meta: {self.tipo_meta}] {self.especie.nome_popular}"

    def save(self, *args, **kwargs):
        # Atualiza data_atualizacao
        self.data_atualizacao = timezone.now()

        # Atualiza o status com base nas datas e no progresso
        hoje = timezone.now().date()
        if self.data_inicial <= hoje <= self.data_final:
            self.status = self.STATUS_EM_ANDAMENTO
        elif hoje > self.data_final:
            if self.meta_atingida:
                self.status = self.STATUS_FINALIZADA_COMPLETA
            else:
                self.status = self.STATUS_FINALIZADA_INCOMPLETA
        else:
            # Caso a data inicial ainda não tenha chegado, podemos definir como "Em andamento"
            self.status = self.STATUS_EM_ANDAMENTO

        super().save(*args, **kwargs)

    # Propriedades existentes
    @property
    def quantidade_acumulada(self):
        """
        Soma a quantidade feita no período, variando conforme tipo_meta:
          - semeadura -> soma Semeadura
          - repique -> soma Repique
          - etc.
        """
        from decimal import Decimal

        if self.tipo_meta == 'semeadura':
            from apps.lotes.models import Semeadura
            qs = Semeadura.objects.filter(
                lote__especie=self.especie,
                data_semeia__gte=self.data_inicial,
                data_semeia__lte=self.data_final
            ).aggregate(total=Sum('qtd_sementes_utilizada'))
            return qs['total'] or Decimal('0')

        elif self.tipo_meta == 'repique':
            from apps.repique.models import Repique
            qs = Repique.objects.filter(
                semeadura__lote__especie=self.especie,
                data_repique__gte=self.data_inicial,
                data_repique__lte=self.data_final
            ).aggregate(total=Sum('quantidade_repicada'))
            return qs['total'] or Decimal('0')
        
        elif self.tipo_meta == 'selecao_estufa':
            from apps.estufa.models import Selecao
            qs = Selecao.objects.filter(
                semeadura__lote__especie=self.especie,
                data_selecao__gte=self.data_inicial,
                data_selecao__lte=self.data_final
            ).aggregate(total=Sum('quantidade_selecao'))
            return qs['total'] or Decimal('0')

        else:
            # plantio, coleta, ou outros — se você quiser lógica específica, coloque aqui
            return 0

    @property
    def meta_atingida(self):
        return self.quantidade_acumulada >= self.quantidade

    @property
    def percentual_cumprido(self):
        if self.quantidade == 0:
            return 0
        return round((self.quantidade_acumulada / self.quantidade) * 100, 2)
