# apps/metas/views.py

from django.shortcuts import render, redirect
from apps.dashboard.utils import get_user_info
from django.utils.timezone import now
from apps.metas.models import MetasModels
from apps.metas.forms import MetasForm, MetasEditForm
from django.shortcuts import get_object_or_404
from django.http import JsonResponse
from django.template.loader import render_to_string
from django.contrib import messages
from django.utils.safestring import mark_safe
from django.contrib import messages
from django.utils.safestring import mark_safe

def metas_create(request):
    """
    Cria uma nova meta via modal.
    """
    if request.method == 'POST':
        form = MetasForm(request.POST)
        if form.is_valid():
            meta = form.save(commit=False)
            # Se houver usuário logado, vincula
            if request.user.is_authenticated:
                meta.criado_por = request.user
            meta.save()
            messages.success(request, mark_safe(
                '<i class="fa-solid fa-circle-check"></i> <strong class="mx-1">Sucesso!</strong> Meta criada com êxito.'))
            return JsonResponse({'success': True})
        else:
            return JsonResponse({'success': False, 'errors': form.errors})
    else:
        form = MetasForm()
        html_form = render_to_string('metas/create_meta_modal.html', {'form': form}, request=request)
        return JsonResponse({'html_form': html_form})


def metas_list(request):
    """
    Lista todas as metas ativas.
    """
    user_info = get_user_info(request.user.id)
    metas_ativas = MetasModels.objects.filter(finalizado=False).order_by('-data_criacao')

    metas_info = []
    for meta in metas_ativas:
        # Atualiza o status chamando save() para recalcular o status
        meta.save()

        metas_info.append({
            'obj': meta,
            'especie': meta.especie.nome_popular,
            'tipo_meta': meta.get_tipo_meta_display(),
            'data_inicial': meta.data_inicial,
            'data_final': meta.data_final,
            'quantidade_meta': meta.quantidade,
            'quantidade_feita': meta.quantidade_acumulada,
            'status': meta.status,
            'percentual': meta.percentual_cumprido,
            'criado_por': meta.criado_por.usuariofuncionario.funcionario.nome_completo if meta.criado_por and hasattr(meta.criado_por, 'usuariofuncionario') else 'Desconhecido',
        })

    context = {
        'metas_info': metas_info,
        'user_info': user_info,
    }
    return render(request, 'metas/lista_metas.html', context)

def metas_finalized_list(request):
    """
    Lista todas as metas finalizadas.
    """
    user_info = get_user_info(request.user.id)
    metas_finalizadas = MetasModels.objects.filter(finalizado=True).order_by('-data_criacao')

    metas_info = []
    for meta in metas_finalizadas:
        metas_info.append({
            'obj': meta,
            'especie': meta.especie.nome_popular,
            'tipo_meta': meta.get_tipo_meta_display(),
            'data_inicial': meta.data_inicial,
            'data_final': meta.data_final,
            'quantidade_meta': meta.quantidade,
            'quantidade_feita': meta.quantidade_acumulada,
            'status': meta.status,
            'percentual': meta.percentual_cumprido,
        })

    context = {
        'metas_info': metas_info,
        'user_info': user_info,
    }
    return render(request, 'metas/lista_metas_finalizadas.html', context)


def metas_edit(request, pk):
    """
    Edita uma meta existente.
    """
    meta = get_object_or_404(MetasModels, pk=pk)

    if request.method == 'POST':
        form = MetasEditForm(request.POST, instance=meta)
        if form.is_valid():
            form.save()
            messages.success(request, mark_safe(
                '<i class="fa-solid fa-circle-check"></i> <strong class="mx-1">Sucesso!</strong> Meta editada com êxito.'))
            return JsonResponse({'success': True})
        else:
            messages.error(request, mark_safe(
                '<i class="fa-solid fa-triangle-exclamation"></i> <strong class="mx-1">Erro!</strong> Não foi possível editar a meta. Verifique os dados informados.'))
    else:
        form = MetasEditForm(instance=meta)

    html_form = render_to_string('metas/edit_meta_modal.html', {'form': form, 'meta': meta}, request=request)
    return JsonResponse({'html_form': html_form})


def metas_delete(request, pk):
    """
    Exclui uma meta específica.
    """
    meta = get_object_or_404(MetasModels, pk=pk)
    if request.method == 'POST':
        meta.delete()
        messages.success(request, mark_safe(
            '<i class="fa-solid fa-circle-check"></i> <strong class="mx-1">Sucesso!</strong> Meta excluída com êxito.'))
        return JsonResponse({'success': True})
    else:
        messages.error(request, mark_safe(
            '<i class="fa-solid fa-triangle-exclamation"></i> <strong class="mx-1">Erro!</strong> Requisição inválida para exclusão.'))
        return JsonResponse({'success': False, 'message': 'Requisição inválida.'})

def metas_finalize(request, pk):
    """
    Finaliza uma meta específica.
    """
    meta = get_object_or_404(MetasModels, pk=pk)

    if request.method == 'POST':
        # Marca a meta como finalizada
        meta.finalizado = True
        meta.status = MetasModels.STATUS_FINALIZADA_COMPLETA
        meta.save()
        messages.success(request, mark_safe(
            '<i class="fa-solid fa-circle-check"></i> <strong class="mx-1">Sucesso!</strong> Meta finalizada com êxito.'))
        return redirect('metas_list')  # Redireciona para a lista de metas

    messages.error(request, mark_safe(
        '<i class="fa-solid fa-triangle-exclamation"></i> <strong class="mx-1">Erro!</strong> Não foi possível finalizar a meta.'))
    return redirect('metas_list')

