from django.shortcuts import render, redirect, get_object_or_404
from apps.dashboard.utils import get_user_info
from apps.estufa.forms import EstufaForm, SelecaoForm
from django.contrib import messages
from apps.lotes.models import Semeadura
from apps.estufa.models import Estufa, LogFinalizacaoEstufa, Selecao
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_estufa(request):
    if not request.user.is_authenticated:
        return redirect('index')

    user_info = get_user_info(request.user.id)

    semeaduras = Semeadura.objects.annotate(
        total_estufa=Sum('estufas__quantidade_mortalidade'),
        total_repique=Subquery(
            Repique.objects.filter(
                semeadura=OuterRef('pk')
            ).values('semeadura').annotate(
                total_repique=Sum('quantidade_repicada')
            ).values('total_repique')[:1]
        ),
        repique_nao_finalizado=Exists(
            Repique.objects.filter(
                semeadura=OuterRef('pk'),
                finalizado=False
            )
        ),
        selecao_exist=Exists(
            Selecao.objects.filter(
                semeadura=OuterRef('pk'),
                quantidade_selecao__gt=0
            )
        ),
        total_quantidade_selecao=Subquery(
            Selecao.objects.filter(
                semeadura=OuterRef('pk'),
                quantidade_selecao__gt=0
            ).values('semeadura').annotate(
                total_quantidade_selecao=Sum('quantidade_selecao')
            ).values('total_quantidade_selecao')[:1]
        ),
        ultima_data_estufa=Max('estufas__data_estufa')
    ).filter(
        Exists(
            Repique.objects.filter(
                semeadura=OuterRef('pk')
            )
        ),
        ~Exists(
            Estufa.objects.filter(
                semeadura=OuterRef('pk'),
                finalizado=True
            )
        )
    ).select_related('lote__especie')

    estufas = []

    for semeadura in semeaduras:
        estufas_data = []
        estufas_quantidades = []
        estufas_ids = []
        estufas_finalizado = []
        selecoes_data = []
        selecoes_quantidades = []
        selecoes_ids = []

        estufas_queryset = semeadura.estufas.filter(finalizado=False)

        total_repique = semeadura.total_repique if semeadura.total_repique is not None else 0
        total_estufa = semeadura.total_estufa if semeadura.total_estufa is not None else 0
        resto_estufa_repique = total_repique - total_estufa

        total_quantidade_selecao = semeadura.total_quantidade_selecao if semeadura.total_quantidade_selecao is not None else 0
        resto_selecao_estufa_repique = resto_estufa_repique - total_quantidade_selecao

        for estufa in estufas_queryset:
            if estufa.quantidade_mortalidade <= resto_selecao_estufa_repique:
                estufas_data.append(estufa.data_estufa.strftime('%d/%m/%Y'))
                estufas_quantidades.append(str(estufa.quantidade_mortalidade))
                estufas_ids.append(estufa.id)
                estufas_finalizado.append(estufa.finalizado)

        if semeadura.selecao_exist:
            selecoes_queryset = Selecao.objects.filter(semeadura=semeadura, quantidade_selecao__gt=0)
            for selecao in selecoes_queryset:
                selecoes_data.append(selecao.data_selecao.strftime('%d/%m/%Y'))
                selecoes_quantidades.append(str(selecao.quantidade_selecao))
                selecoes_ids.append(selecao.id)

        estufas_data = estufas_data if estufas_data else [""]
        estufas_quantidades = estufas_quantidades if estufas_quantidades else [""]
        estufas_ids = estufas_ids if estufas_ids else [""]
        estufas_finalizado = estufas_finalizado if estufas_finalizado else [""]
        selecoes_data = selecoes_data if selecoes_data else [""]
        selecoes_quantidades = selecoes_quantidades if selecoes_quantidades else [""]
        selecoes_ids = selecoes_ids if selecoes_ids else [""]

        if resto_selecao_estufa_repique > 0:
            estufas.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_estufa,
                'total_estufa': semeadura.total_estufa,
                'total_repique': int(semeadura.total_repique),
                'resto_estufa_repique': resto_estufa_repique,
                'resto_selecao_estufa_repique': resto_selecao_estufa_repique,
                'estufa_dates': estufas_data,
                'selecao_dates': selecoes_data,
                'estufa_quantidades': estufas_quantidades,
                'selecao_quantidades': selecoes_quantidades,
                'total_quantidade_selecao': semeadura.total_quantidade_selecao,
                'estufa_ids': estufas_ids,
                'selecao_ids': selecoes_ids,
                'finalizado': estufas_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,
                'repique_nao_finalizado': semeadura.repique_nao_finalizado,
            })

    return render(request, 'estufa/lista_estufa.html', {'semeaduras': semeaduras, 'estufas': estufas, "user_info": user_info})


def lista_estufa_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')

    # Consulta para obter semeaduras com os campos anotados
    semeaduras_query = Semeadura.objects.annotate(
        total_estufa=Sum('estufas__quantidade_mortalidade'),
        total_repique=Subquery(
            Repique.objects.filter(
                semeadura=OuterRef('pk')
            ).values('semeadura').annotate(
                total_repique=Sum('quantidade_repicada')
            ).values('total_repique')[:1]
        ),
        total_quantidade_selecao=Subquery(
            Selecao.objects.filter(
                semeadura=OuterRef('pk')
            ).values('semeadura').annotate(
                total_quantidade_selecao=Sum('quantidade_selecao')
            ).values('total_quantidade_selecao')[:1]
        ),
        ultima_data_estufa=Max('estufas__data_estufa')
    ).select_related('lote__especie')

    # Aplicar filtro de ano, se fornecido
    if ano_filtro:
        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)
        )

    # Filtrar semeaduras que têm mortalidade ou seleção
    semeaduras_query = semeaduras_query.filter(
        Exists(
            Estufa.objects.filter(
                semeadura=OuterRef('pk'),
                quantidade_mortalidade__gt=0
            )
        ) | Exists(
            Selecao.objects.filter(
                semeadura=OuterRef('pk'),
                quantidade_selecao__gt=0
            )
        )
    )

    semeaduras = semeaduras_query.all()
    anos_disponiveis = Semeadura.objects.dates('data_semeia', 'year').distinct()

    estufas = []

    for semeadura in semeaduras:
        estufas_data = []
        estufas_quantidades = []
        estufas_ids = []
        estufas_finalizado = []
        selecoes_data = []
        selecoes_quantidades = []
        selecoes_ids = []

        estufas_queryset = semeadura.estufas.all()
        for estufa in estufas_queryset:
            estufas_data.append(estufa.data_estufa.strftime('%d/%m/%Y'))
            estufas_quantidades.append(str(estufa.quantidade_mortalidade))
            estufas_ids.append(estufa.id)
            estufas_finalizado.append(estufa.finalizado)

        selecoes_queryset = Selecao.objects.filter(semeadura=semeadura)
        for selecao in selecoes_queryset:
            selecoes_data.append(selecao.data_selecao.strftime('%d/%m/%Y'))
            selecoes_quantidades.append(str(selecao.quantidade_selecao))
            selecoes_ids.append(selecao.id)

        estufas.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_estufa,
            'total_estufa': semeadura.total_estufa,
            'total_repique': int(semeadura.total_repique),
            'resto_estufa_repique': semeadura.total_repique - semeadura.total_estufa if semeadura.total_repique and semeadura.total_estufa else 0,
            'resto_selecao_estufa_repique': semeadura.total_repique - semeadura.total_estufa - semeadura.total_quantidade_selecao if semeadura.total_repique and semeadura.total_estufa and semeadura.total_quantidade_selecao else 0,
            'estufa_dates': estufas_data,
            'selecao_dates': selecoes_data,
            'estufa_quantities': estufas_quantidades,
            'selecao_quantities': selecoes_quantidades,
            'estufa_ids': estufas_ids,
            'selecao_ids': selecoes_ids,
            'finalizado': estufas_finalizado,
            'estimativa_minima': semeadura.lote.estimativa_minima,
            'estimativa_maxima': semeadura.lote.estimativa_maxima,
            'estimativa_media': semeadura.lote.estimativa_minima,
            'total_quantidade_selecao': semeadura.total_quantidade_selecao,
        })

    return render(request, 'estufa/lista_estufa_completa.html', {'semeaduras': semeaduras, 'estufas': estufas, 'anos_disponiveis': anos_disponiveis, 'ano_filtro': ano_filtro, "user_info": user_info})
def estufa(request, semeadura_id):
    semeadura = get_object_or_404(Semeadura, pk=semeadura_id)

    if request.method == 'POST':
        form = EstufaForm(request.POST)
        if form.is_valid():
            estufa = form.save(commit=False)
            estufa.semeadura = semeadura
            estufa.registrado_por = request.user
            estufa.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_estufa')
    else:
        form = EstufaForm()

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


def selecao(request, semeadura_id):
    semeadura = get_object_or_404(Semeadura, pk=semeadura_id)
    # Adicione este print para exibir o valor de total_repique para cada instância de semeadura
    print(f'Total Repique para a Semeadura {semeadura.id}')

    if request.method == 'POST':
        form = SelecaoForm(request.POST)
        if form.is_valid():
            selecao = form.save(commit=False)
            selecao.semeadura = semeadura
            selecao.registrado_por = request.user
            selecao.save()
            messages.success(request, mark_safe(
                '<i class="fa-solid fa-circle-check"></i><strong class="mx-1">Sucesso!</strong>Seleção registrada com êxito.'))
            return redirect('lista_estufa')
    else:
        form = SelecaoForm()

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


def excluir_selecao(request, selecao_id):
    if request.method == 'POST' and request.headers.get('x-requested-with') == 'XMLHttpRequest':
        try:
            # Tente obter o repique com o ID fornecido
            selecao = Selecao.objects.get(pk=selecao_id)

            # Verifique se o repique existe antes de excluí-lo
            if selecao:
                selecao.delete()
                return JsonResponse({'message': 'Seleção excluída com sucesso.'})
            else:
                return JsonResponse({'message': 'Seleção não encontrado.'}, status=404)
        except Exception as e:
            return JsonResponse({'message': f'Erro ao excluir Seleçã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 excluir_estufa(request, estufa_id):
    if request.method == 'POST' and request.headers.get('x-requested-with') == 'XMLHttpRequest':
        try:
            # Tente obter o repique com o ID fornecido
            estufa = Estufa.objects.get(pk=estufa_id)

            # Verifique se o repique existe antes de excluí-lo
            if estufa:
                estufa.delete()
                return JsonResponse({'message': 'Estufa excluído com sucesso.'})
            else:
                return JsonResponse({'message': 'Estufa não encontrado.'}, status=404)
        except Exception as e:
            return JsonResponse({'message': f'Erro ao excluir Estufa: {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_estufa(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
            # Substitua 'motivo_exclusao' com o nome correto do campo no seu formulário
            motivo_exclusao = request.POST.get('motivo_exclusao', '')
            # Substitua 'motivo_exclusao_outros' com o nome correto do campo no seu formulário
            motivo_exclusao_outros = request.POST.get(
                'motivo_exclusao_outros', '')

            # 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

            LogFinalizacaoEstufa.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
            )

            Estufa.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> Estufa finalizado com êxito.'))

            return JsonResponse({'status': 'success', 'message': 'Estufa finalizado 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.'})
