from django.shortcuts import render, redirect, get_object_or_404
from django.forms import modelformset_factory
from django.contrib import messages
from datetime import timedelta
from .models import RegistroPaper, HorarioParada
from .forms import RegistroPaperForm, HorarioParadaForm
from apps.dashboard.utils import get_user_info
from datetime import datetime

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

    user_info = get_user_info(request.user.id)

    registros = RegistroPaper.objects.all()

    # Captura os filtros de data (GET)
    inicio = request.GET.get("inicio")
    fim = request.GET.get("fim")

    if inicio and fim:
        try:
            data_inicio = datetime.strptime(inicio, "%Y-%m-%d").date()
            data_fim = datetime.strptime(fim, "%Y-%m-%d").date()
            registros = registros.filter(data__range=(data_inicio, data_fim))
        except ValueError:
            pass  # ignora se houver erro de formatação

    registros = registros.order_by('-data')

    return render(request, 'paperpot/lista_paperpot.html', {
        "user_info": user_info,
        "registros": registros
    })

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

    user_info = get_user_info(request.user.id)
    HorarioParadaFormSet = modelformset_factory(HorarioParada, form=HorarioParadaForm, extra=1, can_delete=True)

    if request.method == 'POST':
        form = RegistroPaperForm(request.POST)
        formset = HorarioParadaFormSet(request.POST, queryset=HorarioParada.objects.none())

        if form.is_valid() and formset.is_valid():
            registro = form.save(commit=False)

            # Cálculos backend
            registro.substrato_litros = registro.substrato_balde * 40 if registro.substrato_balde else 0
            registro.producao_por_litro = (
                registro.quantidade_paper_cheio / registro.substrato_litros
                if registro.substrato_litros else 0
            )

            # Horas trabalhadas e paradas
            total_horas = 0
            num_paradas = 0
            for f in formset:
                if f.cleaned_data and not f.cleaned_data.get('DELETE'):
                    inicio = f.cleaned_data.get('horario_inicio')
                    parada = f.cleaned_data.get('horario_parada')
                    if inicio and parada:
                        delta = parada - inicio
                        total_horas += delta.total_seconds() / 3600
                        num_paradas += 1

            registro.producao_por_papel = (
                (registro.quantidade_paper_cheio / total_horas / 24)
                if total_horas > 0 else 0
            )

            registro.observacao = registro.observacao or ""
            registro.save()

            # Basocote (kg)
            basocote = (registro.substrato_litros * 0.18) / 40 if registro.substrato_litros else 0
            registro.basocote_kg = round(basocote, 2)  # se desejar salvar

            # Salvar horários
            for f in formset:
                if f.cleaned_data and not f.cleaned_data.get('DELETE'):
                    horario = f.save(commit=False)
                    horario.registro = registro
                    horario.save()

            messages.success(request, "Registro salvo com sucesso!")
            return redirect('lista_paperpot')
        else:
            messages.error(request, "Corrija os erros no formulário.")
    else:
        form = RegistroPaperForm()
        formset = HorarioParadaFormSet(queryset=HorarioParada.objects.none())

    return render(request, 'paperpot/criar_registro_paper.html', {
        "form": form,
        "formset": formset,
        "user_info": user_info
    })

def editar_registro_paper(request, pk):
    if not request.user.is_authenticated:
        return redirect('index')

    user_info = get_user_info(request.user.id)

    registro = get_object_or_404(RegistroPaper, pk=pk)
    horarios = HorarioParada.objects.filter(registro=registro)

    if request.method == 'POST':
        form = RegistroPaperForm(request.POST, instance=registro)
        if form.is_valid():
            form.save()

            # Atualiza horários antigos
            HorarioParada.objects.filter(registro=registro).delete()
            total = int(request.POST.get('total_horarios', 0))

            for i in range(total):
                inicio = request.POST.get(f'hora_inicio_{i}')
                parada = request.POST.get(f'hora_parada_{i}')
                if inicio and parada:
                    HorarioParada.objects.create(
                        registro=registro,
                        hora_inicio=inicio,
                        hora_parada=parada
                    )

            return redirect('lista_paperpot')
    else:
        form = RegistroPaperForm(instance=registro)

    return render(request, 'paperpot/editar_registro_paper.html', {
        'form': form,
        'registro': registro,
        'horarios': horarios,
        'total_horarios': horarios.count(),
        "user_info": user_info
    })



def excluir_registro_paper(request, pk):
    if not request.user.is_authenticated:
        return redirect('index')

    registro = get_object_or_404(RegistroPaper, pk=pk)
    registro.delete()
    messages.success(request, 'Registro excluído com sucesso!')
    return redirect('lista_paperpot')
