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 django.contrib import messages
from django.utils.safestring import mark_safe

#FORMS
from apps.producao.forms import PeriodoColetaForm, PorcentagemColetaForm, ProducaoMudasForm

#MODELS
from apps.especies.models import Especies
from apps.producao.models import ProducaoMudas, PeriodoColeta, PorcentagemColeta


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

    if request.method == 'POST':
        formulario = ProducaoMudasForm(request.POST, request.FILES)
        porcentagem_coleta_form = PorcentagemColetaForm(request.POST)
        periodo_coleta_form = PeriodoColetaForm(
            request.POST, prefix='periodo_coleta')

        if formulario.is_valid() and porcentagem_coleta_form.is_valid():
            # Salvar ProducaoMudas
            producao_mudas = formulario.save(commit=False)
            producao_mudas.especie = especie

            # Salvar PorcentagemColeta
            porcentagem_coleta = porcentagem_coleta_form.save(commit=False)
            porcentagem_coleta.especie = especie

            # Processar os períodos de coleta
            periodos_selecionados = request.POST.getlist(
                'periodo_coleta-bioma_nome')
            meses_inicio = request.POST.getlist('periodo_coleta-mes_inicio')
            meses_fim = request.POST.getlist('periodo_coleta-mes_fim')

            for i in range(len(periodos_selecionados)):
                periodo_coleta = PeriodoColeta(
                    especie=especie,
                    bioma_nome=periodos_selecionados[i],
                    mes_inicio=meses_inicio[i],
                    mes_fim=meses_fim[i]
                )

            # Verificar se já existe uma produção com o mesmo especie_id
            if ProducaoMudas.objects.filter(especie=especie).exists():
                # Mensagem de erro
                messages.error(request, mark_safe('<i class="fa-solid fa-circle-exclamation"></i><strong class="mx-1">Erro!</strong> Produção de Mudas já cadastrada.'))
            else:
                producao_mudas.save()
                porcentagem_coleta.save()
                periodo_coleta.save()
                messages.success(request, mark_safe(
                    '<i class="fa-solid fa-circle-check"></i><strong class="mx-1">Sucesso!</strong> Produção de Mudas cadastrado com êxito.'))
            return redirect('lista_especies')

    else:
        formulario = ProducaoMudasForm()
        porcentagem_coleta_form = PorcentagemColetaForm()
        periodo_coleta_form = PeriodoColetaForm(prefix='periodo_coleta')

    user_info = get_user_info(request.user.id)
    return render(request, 'producao_mudas/cadastro_prod_mudas.html', {
        "user_info": user_info,
        'formulario': formulario,
        'porcentagem_coleta_form': porcentagem_coleta_form,
        'periodo_coleta_form': periodo_coleta_form,
        'especie': especie,
    })



def editar_prod_mudas(request, especie_id):
    especie = get_object_or_404(Especies, id=especie_id)
    producao_mudas = ProducaoMudas.objects.filter(especie=especie).first()
    porcentagem_coleta = PorcentagemColeta.objects.filter(
        especie=especie).first()
    periodo_coleta = PeriodoColeta.objects.filter(especie=especie)

    if request.method == 'POST':
        formulario = ProducaoMudasForm(request.POST, instance=producao_mudas)
        porcentagem_coleta_form = PorcentagemColetaForm(
            request.POST, instance=porcentagem_coleta)
        periodo_coleta_forms = [PeriodoColetaForm(
            request.POST, prefix=f'periodo_coleta_{item.id}', instance=item) for item in periodo_coleta]
        periodo_coleta_form_novo = PeriodoColetaForm(
            request.POST, prefix='periodo_coleta_novo')

        try:
            if formulario.is_valid() and porcentagem_coleta_form.is_valid() and all(form.is_valid() for form in periodo_coleta_forms):
                producao_mudas = formulario.save(commit=False)
                producao_mudas.especie = especie
                producao_mudas.save()

                porcentagem_coleta = porcentagem_coleta_form.save(commit=False)
                porcentagem_coleta.especie = especie
                porcentagem_coleta.save()

                # Processar os períodos de coleta existentes
                for form in periodo_coleta_forms:
                    form.save()

                # Processar os novos períodos de coleta
                periodos_selecionados_novo = request.POST.getlist(
                    'periodo_coleta_novo-bioma_nome')
                meses_inicio_novo = request.POST.getlist(
                    'periodo_coleta_novo-mes_inicio')
                meses_fim_novo = request.POST.getlist(
                    'periodo_coleta_novo-mes_fim')

                for i in range(len(periodos_selecionados_novo)):
                    periodo_coleta_novo = PeriodoColeta(
                        especie=especie,
                        bioma_nome=periodos_selecionados_novo[i],
                        mes_inicio=meses_inicio_novo[i],
                        mes_fim=meses_fim_novo[i]
                    )
                    periodo_coleta_novo.save()
                
                messages.success(request, mark_safe(
                    '<i class="fa-solid fa-circle-check"></i><strong class="mx-1">Sucesso!</strong> Produção de Mudas atualizada com êxito.'))
                return redirect('lista_especies')

        except Exception as e:
            messages.error(
                request, f"Erro durante o processamento do formulário: {e}")

    else:
        formulario = ProducaoMudasForm(instance=producao_mudas)
        porcentagem_coleta_form = PorcentagemColetaForm(
            instance=porcentagem_coleta)
        periodo_coleta_forms = [PeriodoColetaForm(
            prefix=f'periodo_coleta_{item.id}', instance=item) for item in periodo_coleta]
        periodo_coleta_form_novo = PeriodoColetaForm(
            prefix='periodo_coleta_novo')

    user_info = get_user_info(request.user.id)
    return render(request, 'producao_mudas/editar_prod_mudas.html', {
        "user_info": user_info,
        'formulario': formulario,
        'porcentagem_coleta_form': porcentagem_coleta_form,
        'periodo_coleta_forms': periodo_coleta_forms,
        'periodo_coleta_form_novo': periodo_coleta_form_novo,
        'especie': especie,
    })


@login_required
def excluir_periodo_coleta(request, periodo_coleta_id):
    try:
        periodo_coleta = get_object_or_404(PeriodoColeta, id=periodo_coleta_id)
        periodo_coleta.delete()
    except Exception as e:
        messages.error(request, f'Erro ao excluir o período de coleta: {e}')

    return redirect('editar_prod_mudas')