from django.shortcuts import render, redirect, get_object_or_404
from apps.dashboard.utils import get_user_info
from apps.aclimatacao.forms import AclimatacaoForm
from django.contrib import messages
from apps.aclimatacao.models import Aclimatacao, LogFinalizacaoAclimatacao
from apps.lotes.models import Semeadura
from apps.estufa.models import Estufa
from apps.repique.models import Repique
from datetime import datetime
from django.db.models import Sum, Max
from django.http import JsonResponse
from django.db.models import Sum, OuterRef, Exists,Subquery
from django.utils.safestring import mark_safe
from django.utils import timezone

# Create your views here.
def lista_aclimatacao(request):
    if not request.user.is_authenticated:
        return redirect('index')

    user_info = get_user_info(request.user.id)

    semeaduras = Semeadura.objects.annotate(
        total_aclimatacao=Sum('aclimatacoes__quantidade_mortalidade'),
        total_repique=Subquery(
            Repique.objects.filter(
                semeadura=OuterRef('pk'),
                finalizado=True
            ).values('semeadura').annotate(
                total_repique=Sum('quantidade_repicada')
            ).values('total_repique')[:1]
        ),
        total_mortalidade_estufa=Subquery(
            Estufa.objects.filter(
                semeadura=OuterRef('pk'),
                finalizado=True
            ).values('semeadura').annotate(
                total_mortalidade=Sum('quantidade_mortalidade')
            ).values('total_mortalidade')[:1]
        ),
        ultima_data_aclimatacao=Max('aclimatacoes__data_aclimatacao')
    ).filter(
        Exists(
            Repique.objects.filter(
                semeadura=OuterRef('pk'),
                finalizado=True
            )
        ),
        Exists(
            Estufa.objects.filter(
                semeadura=OuterRef('pk'),
                finalizado=True
            )
        ),
        ~Exists(
            Aclimatacao.objects.filter(
                semeadura=OuterRef('pk'),
                finalizado=True
            )
        ),
    ).select_related('lote__especie')
    

    aclimatacoes = []

    for semeadura in semeaduras:
        aclimatacoes_data = []
        aclimatacoes_quantidades = []
        aclimatacoes_ids = []
        aclimatacoes_finalizado = []

        
        aclimatacoes_queryset = semeadura.aclimatacoes.filter(finalizado=False)
        for aclimatacao in aclimatacoes_queryset:
            
            aclimatacoes_data.append(aclimatacao.data_aclimatacao.strftime('%d/%m/%Y'))
            aclimatacoes_quantidades.append(str(aclimatacao.quantidade_mortalidade))
            aclimatacoes_ids.append(aclimatacao.id)
            aclimatacoes_finalizado.append(aclimatacao.finalizado)

        # Certifique-se de que essas variáveis são sempre listas
        aclimatacoes_data = aclimatacoes_data if aclimatacoes_data else [""]
        aclimatacoes_quantidades = aclimatacoes_quantidades if aclimatacoes_quantidades else [""]
        aclimatacoes_ids = aclimatacoes_ids if aclimatacoes_ids else [""]

        aclimatacoes.append({
            'semeadura_id': semeadura.id,
            'numero_muda': semeadura.numero_muda,
            'data_semeia': semeadura.data_semeia,
            'nome_popular': semeadura.lote.especie.nome_popular,
            'especies': semeadura.lote.especie.especies,
            'ultima_data_aclimatacao': semeadura.ultima_data_aclimatacao,
            'total_aclimatacao': semeadura.total_aclimatacao,
            'total_repique':int(semeadura.total_repique),
            'total_mortalidade_estufa': semeadura.total_mortalidade_estufa,
            'aclimatacao_dates': aclimatacoes_data,
            'aclimatacao_quantities': aclimatacoes_quantidades,
            'aclimatacao_ids': aclimatacoes_ids,
            'finalizado': aclimatacoes_finalizado,
            'estimativa_minima': semeadura.lote.estimativa_minima,
            'estimativa_maxima': semeadura.lote.estimativa_maxima,
            'estimativa_media': semeadura.lote.estimativa_minima,
            'qtd_sementes_utilizada': semeadura.qtd_sementes_utilizada,
        })    

    return render(request, 'aclimatacao/lista_aclimatacao.html', {'semeaduras': semeaduras, 'aclimatacoes': aclimatacoes, "user_info": user_info})



def lista_aclimatacao_completa(request):
    if not request.user.is_authenticated:
        return redirect('index')

    user_info = get_user_info(request.user.id)
    ano_filtro = request.GET.get('ano')

    # Use Prefetch para carregar os dados relacionados de Repique
    semeaduras_query = Semeadura.objects.annotate(
        total_aclimatacao=Sum('aclimatacoes__quantidade_mortalidade'),
        ultima_data_aclimatacao=Max('aclimatacoes__data_aclimatacao')
    ).select_related('lote__especie').filter(
        Exists(
            Estufa.objects.filter(
                semeadura=OuterRef('pk'),
                finalizado=True
            )
        )
    )
    # Aplicar filtro por ano, se fornecido
    if ano_filtro:
        # Converta o ano para um objeto datetime para comparar com a data_semeia
        data_inicio = datetime(int(ano_filtro), 1, 1)
        data_fim = datetime(int(ano_filtro), 12, 31)
        semeaduras_query = semeaduras_query.filter(data_semeia__range=(data_inicio, data_fim))

    semeaduras = semeaduras_query.all()

    # Obtenha os anos disponíveis após o filtro
    anos_disponiveis = Semeadura.objects.dates('data_semeia', 'year').distinct()

    aclimatacoes = []

    for semeadura in semeaduras:
        aclimatacoes_data = []
        aclimatacoes_quantidades = []
        aclimatacoes_ids = []
        aclimatacoes_finalizado = []

        aclimatacoes_queryset = semeadura.aclimatacoes.all()
        for aclimatacao in aclimatacoes_queryset:
            
            aclimatacoes_data.append(aclimatacao.data_aclimatacao.strftime('%d/%m/%Y'))
            aclimatacoes_quantidades.append(str(aclimatacao.quantidade_mortalidade))
            aclimatacoes_ids.append(aclimatacao.id)
            aclimatacoes_finalizado.append(aclimatacao.finalizado)

        # Certifique-se de que essas variáveis são sempre listas
        aclimatacoes_data = aclimatacoes_data if aclimatacoes_data else [""]
        aclimatacoes_quantidades = aclimatacoes_quantidades if aclimatacoes_quantidades else [""]
        aclimatacoes_ids = aclimatacoes_ids if aclimatacoes_ids else [""]

        aclimatacoes.append({
            'semeadura_id': semeadura.id,
            'numero_muda': semeadura.numero_muda,
            'data_semeia': semeadura.data_semeia,
            'nome_popular': semeadura.lote.especie.nome_popular,
            'especies': semeadura.lote.especie.especies,
            'ultima_data_estufa': semeadura.ultima_data_aclimatacao,
            'total_aclimatacao': semeadura.total_aclimatacao,
            'aclimatacao_dates': aclimatacoes_data,
            'aclimatacao_quantities': aclimatacoes_quantidades,
            'aclimatacao_ids': aclimatacoes_ids,
            'finalizado': aclimatacoes_finalizado,
            'estimativa_minima': semeadura.lote.estimativa_minima,
            'estimativa_maxima': semeadura.lote.estimativa_maxima,
            'estimativa_media': semeadura.lote.estimativa_minima,
        })
           
    return render(request, 'aclimatacao/lista_aclimatacao_completa.html', {'semeaduras': semeaduras, 'aclimatacoes': aclimatacoes,'anos_disponiveis': anos_disponiveis, 'ano_filtro': ano_filtro, "user_info": user_info})


def aclimatacao(request, semeadura_id):
    semeadura = get_object_or_404(Semeadura, pk=semeadura_id)

    if request.method == 'POST':
        form = AclimatacaoForm(request.POST)
        if form.is_valid():
            aclimatacao = form.save(commit=False)
            aclimatacao.semeadura = semeadura
            aclimatacao.save()
            messages.success(request, mark_safe(
                    '<i class="fa-solid fa-circle-check"></i><strong class="mx-1">Sucesso!</strong> Mortalidade registrado com êxito.'))
            return redirect('lista_aclimatacao')
    else:
        form = AclimatacaoForm()

    return render(request, 'aclimatacao.html', {'form': form, 'semeadura': semeadura})

def excluir_aclimatacao(request, aclimatacao_id):
    if request.method == 'POST' and request.headers.get('x-requested-with') == 'XMLHttpRequest':
        try:
            # Tente obter o repique com o ID fornecido
            aclimatacao = Aclimatacao.objects.get(pk=aclimatacao_id)

            # Verifique se o repique existe antes de excluí-lo
            if aclimatacao:
                messages.success(request, mark_safe(
                    '<i class="fa-solid fa-circle-check"></i><strong class="mx-1">Sucesso!</strong> Aclimatação excluído com êxito.'))
                aclimatacao.delete()
                return JsonResponse({'message': 'Aclimatação excluído com sucesso.'})
            else:
                messages.error(request, mark_safe(
                    '<i class="fa-solid fa-circle-exclamation"></i><strong class="mx-1">Erro!</strong> Aclimatação não encontrado.'))
                return JsonResponse({'message': 'Aclimatação não encontrado.'}, status=404)
        except Exception as e:
            return JsonResponse({'message': f'Erro ao excluir aclimatação: {str(e)}'}, status=500)

    return JsonResponse({'message': 'Método de solicitação inválido ou não é uma solicitação AJAX.'}, status=400)


def finalizar_aclimatacao(request, semeadura_id):
    try:
        if request.method == 'POST':
            semeadura = Semeadura.objects.get(pk=semeadura_id)

            # Adicione a definição de motivo_exclusao e motivo_exclusao_outros aqui
            motivo_exclusao = request.POST.get('motivo_exclusao', '')  # Substitua 'motivo_exclusao' com o nome correto do campo no seu formulário
            motivo_exclusao_outros = request.POST.get('motivo_exclusao_outros', '')  # Substitua 'motivo_exclusao_outros' com o nome correto do campo no seu formulário

            # Exemplo de verificação e definição de motivo_final
            if motivo_exclusao == 'Outros' and motivo_exclusao_outros:
                motivo_final = motivo_exclusao_outros
            else:
                motivo_final = motivo_exclusao

            LogFinalizacaoAclimatacao.objects.create(
                numero_lote=semeadura.numero_muda,
                data_lote=semeadura.data_semeia,
                semeadura_id=semeadura_id,
                data_exclusao=timezone.now(),
                hora_exclusao=timezone.now(),
                usuario_exclusao=request.user,
                nome_usuario_exclusao=request.user.username,
                motivo_exclusao=motivo_final,
                motivo_exclusao_outros=motivo_exclusao_outros
            )

            Aclimatacao.objects.filter(semeadura_id=semeadura_id).update(finalizado=True)
            messages.success(request, mark_safe(
                    '<i class="fa-solid fa-circle-check"></i><strong class="mx-1">Sucesso!</strong> Aclimatação finalizada com êxito.'))

            return JsonResponse({'status': 'success', 'message': 'Aclimatação finalizada com sucesso.'})

        elif request.method == 'GET':
            return JsonResponse({'status': 'success', 'message': 'Solicitação GET permitida para esta view.'})

    except Exception as e:
        print(f'Erro na view finalizar_repique: {e}')
        return JsonResponse({'status': 'error', 'message': 'Erro interno no servidor.'}, status=500)

    return JsonResponse({'status': 'error', 'message': 'Método não suportado.'})
