from django.shortcuts import render, redirect, get_object_or_404
from apps.dashboard.utils import get_user_info
from django.contrib.auth.decorators import login_required
from apps.outras_informacoes.forms import PlantioOutrasInformacoesForm, PeriodoFloracaoForm, PeriodoFrutificacaoForm
from django.contrib import messages
from apps.especies.models import Especies
from apps.outras_informacoes.models import PeriodoFloracao, PeriodoFrutificacao, PlantioOutrasInformacoesModels
from django.core.exceptions import ObjectDoesNotExist
from django.utils.safestring import mark_safe

def plantio_outras_info(request, especie_id):
    especie = Especies.objects.get(id=especie_id)

    if request.method == 'POST':
        form = PlantioOutrasInformacoesForm(request.POST)
        periodo_floracao_form = PeriodoFloracaoForm(
            request.POST, prefix='periodo_floracao')
        periodo_frutificacao_form = PeriodoFrutificacaoForm(
            request.POST, prefix='periodo_frutificacao')

        if form.is_valid():

            # Salve a instância de PlantioOutrasInformacoesModels e obtenha o ID
            plantio_info = form.save(commit=False)
            plantio_info.especie = especie
            plantio_info.save()

            # Processar os períodos de Floração
            periodos_selecionados_floracao = request.POST.getlist(
                'periodo_floracao-bioma_nome')
            meses_inicio_floracao = request.POST.getlist(
                'periodo_floracao-mes_inicio')
            meses_fim_floracao = request.POST.getlist(
                'periodo_floracao-mes_fim')

            for i in range(len(periodos_selecionados_floracao)):
                periodo_flora = PeriodoFloracao(
                    bioma_nome=periodos_selecionados_floracao[i],
                    mes_inicio=meses_inicio_floracao[i],
                    mes_fim=meses_fim_floracao[i]
                )

                # Salvar a instância de PeriodoFloracao para obter um ID
                periodo_flora.save()

                # Atribuir a instância de Especies após salvar a instância de PeriodoFloracao
                periodo_flora.especie = especie

                # Salvar novamente para persistir a relação
                periodo_flora.save()

            # Processar os períodos de Frutificação
            periodos_selecionados_frutificacao = request.POST.getlist(
                'periodo_frutificacao-bioma_nome')
            meses_inicio_frutificacao = request.POST.getlist(
                'periodo_frutificacao-mes_inicio')
            meses_fim_frutificacao = request.POST.getlist(
                'periodo_frutificacao-mes_fim')

            for i in range(len(periodos_selecionados_frutificacao)):
                # Criar uma instância de PeriodoFrutificacao sem atribuir a especie
                periodo_frut = PeriodoFrutificacao(
                    bioma_nome=periodos_selecionados_frutificacao[i],
                    mes_inicio=meses_inicio_frutificacao[i],
                    mes_fim=meses_fim_frutificacao[i]
                )

                # Salvar a instância de PeriodoFrutificacao para obter um ID
                periodo_frut.save()

                # Atribuir a instância de Especies após salvar a instância de PeriodoFrutificacao
                periodo_frut.especie = especie

                # Salvar novamente para persistir a relação
                periodo_frut.save()

            messages.success(request, mark_safe(
                    '<i class="fa-solid fa-circle-check"></i><strong class="mx-1">Sucesso!</strong> Informações da muda cadastradas com êxito.'))
            return redirect('lista_especies')

    else:
        form = PlantioOutrasInformacoesForm()
        periodo_floracao_form = PeriodoFloracaoForm(prefix='periodo_floracao')
        periodo_frutificacao_form = PeriodoFrutificacaoForm(
            prefix='periodo_frutificacao')

    user_info = get_user_info(request.user.id)
    return render(request, 'outras_informacoes/plantio_outras_info.html', {
        "user_info": user_info,
        'form': form,
        'periodo_floracao_form': periodo_floracao_form,
        'periodo_frutificacao_form': periodo_frutificacao_form,
        'especie': especie,
    })

def editar_plantio_outras_informacoes(request, especie_id):
    especie = get_object_or_404(Especies, id=especie_id)
    plantio_info_set = PlantioOutrasInformacoesModels.objects.filter(especie=especie).first()
    periodo_floracao = PeriodoFloracao.objects.filter(especie=especie)
    periodo_frutificacao = PeriodoFrutificacao.objects.filter(especie=especie)

    if request.method == 'POST':
        formulario = PlantioOutrasInformacoesForm(request.POST, instance=plantio_info_set)
        periodo_floracao_forms = [PeriodoFloracaoForm(
            request.POST, prefix=f'periodo_floracao_{item.id}', instance=item) for item in periodo_floracao]
        periodo_floracao_form_novo = PeriodoFloracaoForm(
            request.POST, prefix='periodo_floracao_novo')
        
        periodo_frutificacao_forms = [PeriodoFrutificacaoForm(
            request.POST, prefix=f'periodo_frutificacao_{item.id}', instance=item) for item in periodo_frutificacao]
        periodo_frutificacao_form_novo = PeriodoFrutificacaoForm(
            request.POST, prefix='periodo_frutificacao_novo')

        if formulario.is_valid() and all(form.is_valid() for form in periodo_floracao_forms) and all(form.is_valid() for form in periodo_frutificacao_forms):
            # Salvar informações do plantio
            plantio_info = formulario.save(commit=False)
            plantio_info.especie = especie
            plantio_info.save()

            # Salvar períodos de floração existentes
            for form in periodo_floracao_forms:
                form_instance = form.save(commit=False)
                form_instance.especie = especie
                form_instance.save()

            # Processar os novos períodos de floração
            periodos_selecionados_floracao_novo = request.POST.getlist(
                'periodo_floracao_novo-bioma_nome')
            meses_inicio_floracao_novo = request.POST.getlist(
                'periodo_floracao_novo-mes_inicio')
            meses_fim_floracao_novo = request.POST.getlist(
                'periodo_floracao_novo-mes_fim')

            for i in range(len(periodos_selecionados_floracao_novo)):
                periodo_floracao_novo = PeriodoFloracao(
                    especie=especie,
                    bioma_nome=periodos_selecionados_floracao_novo[i],
                    mes_inicio=meses_inicio_floracao_novo[i],
                    mes_fim=meses_fim_floracao_novo[i]
                )
                periodo_floracao_novo.save()

            # Salvar períodos de frutificação existentes
            for form in periodo_frutificacao_forms:
                form_instance = form.save(commit=False)
                form_instance.especie = especie
                form_instance.save()

            # Processar os novos períodos de frutificação
            periodos_selecionados_frutificacao_novo = request.POST.getlist(
                'periodo_frutificacao_novo-bioma_nome')
            meses_inicio_frutificacao_novo = request.POST.getlist(
                'periodo_frutificacao_novo-mes_inicio')
            meses_fim_frutificacao_novo = request.POST.getlist(
                'periodo_frutificacao_novo-mes_fim')

            for i in range(len(periodos_selecionados_frutificacao_novo)):
                periodo_frutificacao_novo = PeriodoFrutificacao(
                    especie=especie,
                    bioma_nome=periodos_selecionados_frutificacao_novo[i],
                    mes_inicio=meses_inicio_frutificacao_novo[i],
                    mes_fim=meses_fim_frutificacao_novo[i]
                )
                periodo_frutificacao_novo.save()

            # Adicionar mensagens de sucesso ou redirecionar conforme necessário
            messages.success(request, mark_safe(
                    '<i class="fa-solid fa-circle-check"></i><strong class="mx-1">Sucesso!</strong> Informações da muda atualizadas com êxito.'))
            return redirect('lista_especies')
        else:
            # Adicionar mensagens de erro ou tratar conforme necessário
            messages.error(request, mark_safe(
                    '<i class="fa-solid fa-circle-exclamation"></i><strong class="mx-1">Erro!</strong> no formulário. Verifique os dados inseridos.'))
            print(formulario.errors)
    else:
        # Se for um pedido GET, renderizar o formulário com as instâncias existentes
        formulario = PlantioOutrasInformacoesForm(instance=plantio_info_set)
        periodo_floracao_forms = [PeriodoFloracaoForm(
            prefix=f'periodo_floracao_{item.id}', instance=item) for item in periodo_floracao]
        periodo_floracao_form_novo = PeriodoFloracaoForm(prefix='periodo_floracao_novo')
        
        periodo_frutificacao_forms = [PeriodoFrutificacaoForm(
            prefix=f'periodo_frutificacao_{item.id}', instance=item) for item in periodo_frutificacao]
        periodo_frutificacao_form_novo = PeriodoFrutificacaoForm(prefix='periodo_frutificacao_novo')

        user_info = get_user_info(request.user.id)
        return render(request, 'outras_informacoes/editar_plantio_outras_informacoes.html', {
            "user_info": user_info,
            'formulario': formulario,
            'periodo_floracao_forms': periodo_floracao_forms,
            'periodo_frutificacao_forms': periodo_frutificacao_forms,
            'especie': especie,
            'periodo_floracao_form_novo': periodo_floracao_form_novo,
            'periodo_frutificacao_form_novo': periodo_frutificacao_form_novo,
        })
    
@login_required
def excluir_periodo_floracao(request, periodo_floracao_id):
    try:
        periodo_floracao = get_object_or_404(PeriodoFloracao, id=periodo_floracao_id)
        periodo_floracao.delete()
    except Exception as e:
        messages.error(request, mark_safe(
                    f'<i class="fa-solid fa-circle-exclamation"></i><strong class="mx-1">Erro!</strong> ao excluir o período de Floração: {e}'))
        messages.error(request, f'Erro ao excluir o período de Floração: {e}')

    return redirect('editar_plantio_outras_informacoes')

@login_required
def excluir_periodo_frutificacao(request, periodo_frutificacao_id):
    try:
        periodo_frutificacao = get_object_or_404(PeriodoFrutificacao, id=periodo_frutificacao_id)
        periodo_frutificacao.delete()
    except Exception as e:
            messages.error(request, mark_safe(
                    f'<i class="fa-solid fa-circle-exclamation"></i><strong class="mx-1">Erro!</strong> ao excluir o período de Frutificação: {e}'))

    return redirect('editar_plantio_outras_informacoes')
