from django.template.loader import render_to_string
from django.shortcuts import render
from weasyprint import HTML, CSS
from django.http import HttpResponse
from datetime import date, timedelta
from django.utils import timezone
from apps.lotes.models import Semeadura
from django.db.models import Q
from django.shortcuts import render, get_object_or_404, redirect
from apps.dashboard.utils import get_user_info
from apps.lotes.models import CadastroLote, Semeadura
from apps.repique.models import Repique
from apps.funcionario.models import Funcionario
from apps.estufa.models import Estufa, Selecao
from django.db.models import Sum,  Max
from django.contrib.auth.models import User


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

    user_info = get_user_info(request.user.id)
    lotes = CadastroLote.objects.all()
    lote_selecionado = None
    semeaduras_com_repiques = []
    erro = None
    total_utilizado = 0
    sobra_atual = 0

    if request.method == 'POST':
        numero_lote = request.POST.get('numero_lote')
        if numero_lote:
            try:
                lote_selecionado = CadastroLote.objects.get(
                    numero_lote=numero_lote)
                lote_selecionado_registrado_por = (
                    lote_selecionado.registrado_por.usuariofuncionario.funcionario.nome_completo
                    if lote_selecionado.registrado_por and hasattr(lote_selecionado.registrado_por, 'usuariofuncionario') else "Desconhecido"
                )

                semeaduras = Semeadura.objects.filter(
                    lote=lote_selecionado).order_by('data_semeia')
                for semeadura in semeaduras:
                    # Repiques relacionados
                    repiques = Repique.objects.filter(
                        semeadura=semeadura).order_by('data_repique')

                    # Estufas relacionadas
                    estufas = Estufa.objects.filter(
                        semeadura=semeadura).order_by('data_estufa')

                    # Seleções relacionadas
                    selecoes = Selecao.objects.filter(
                        semeadura=semeadura).order_by('data_selecao')

                    semeaduras_com_repiques.append({
                        'semeadura': semeadura,
                        'repiques': repiques,
                        'estufas': [
                            {
                                'data_estufa': estufa.data_estufa,
                                'quantidade_mortalidade': estufa.quantidade_mortalidade,
                                'finalizado': estufa.finalizado,
                                'registrado_por': (
                                    estufa.registrado_por.usuariofuncionario.funcionario.nome_completo
                                    if estufa.registrado_por and hasattr(estufa.registrado_por, 'usuariofuncionario') else "Desconhecido"
                                ),
                            } for estufa in estufas
                        ],
                        'selecoes': [
                            {
                                'data_selecao': selecao.data_selecao,
                                'quantidade_selecao': selecao.quantidade_selecao,
                                'venda': selecao.venda,
                                'registrado_por': (
                                    selecao.registrado_por.usuariofuncionario.funcionario.nome_completo
                                    if selecao.registrado_por and hasattr(selecao.registrado_por, 'usuariofuncionario') else "Desconhecido"
                                ),
                            } for selecao in selecoes
                        ],
                        'registrado_por_semeadura': (
                            semeadura.registrado_por.usuariofuncionario.funcionario.nome_completo
                            if semeadura.registrado_por and hasattr(semeadura.registrado_por, 'usuariofuncionario') else "Desconhecido"
                        ),
                        'repiques_registrados_por': [
                            {
                                'data_repique': repique.data_repique,
                                'quantidade_repicada': repique.quantidade_repicada,
                                'finalizado': repique.finalizado,
                                'registrado_por': (
                                    repique.registrado_por.usuariofuncionario.funcionario.nome_completo
                                    if repique.registrado_por and hasattr(repique.registrado_por, 'usuariofuncionario') else "Desconhecido"
                                ),
                            } for repique in repiques
                        ],
                    })

                total_utilizado = semeaduras.aggregate(total_utilizado=Sum(
                    'qtd_sementes_utilizada'))['total_utilizado'] or 0
                ultima_semeadura = semeaduras.last()
                sobra_atual = ultima_semeadura.sobra_sementes if ultima_semeadura else 0

            except CadastroLote.DoesNotExist:
                erro = "Lote não encontrado."
        else:
            erro = "Por favor, selecione um número de lote."

    context = {
        'user_info': user_info,
        'lotes': lotes,
        'lote_selecionado': lote_selecionado,
        'lote_selecionado_registrado_por': lote_selecionado_registrado_por if lote_selecionado else None,
        'semeaduras_com_repiques': semeaduras_com_repiques,
        'total_utilizado': f"{total_utilizado:.3f}",
        'sobra_atual': f"{sobra_atual:.3f}",
        'erro': erro,

    }
    return render(request, 'relatorios/relatorio_lote.html', context)


MESES_PT = {
    1: 'Janeiro', 2: 'Fevereiro', 3: 'Março', 4: 'Abril',
    5: 'Maio', 6: 'Junho', 7: 'Julho', 8: 'Agosto',
    9: 'Setembro', 10: 'Outubro', 11: 'Novembro', 12: 'Dezembro'
}

def relatorio_geral_semeadura(request):
    user_info = get_user_info(request.user.id)
    hoje = timezone.now().date()
    periodo = request.GET.get('periodo')
    data_inicio = request.GET.get('inicio')
    data_fim = request.GET.get('fim')

    registros = Semeadura.objects.all()

    if periodo == 'hoje':
        registros = registros.filter(data_semeia=hoje)
    elif periodo == 'semana':
        segunda = hoje - timedelta(days=hoje.weekday())
        domingo = segunda + timedelta(days=6)
        registros = registros.filter(data_semeia__range=[segunda, domingo])
    elif periodo == 'mes':
        registros = registros.filter(data_semeia__year=hoje.year, data_semeia__month=hoje.month)
    elif periodo == 'ano':
        registros = registros.filter(data_semeia__year=hoje.year)

    if data_inicio:
        registros = registros.filter(data_semeia__gte=data_inicio)
    if data_fim:
        registros = registros.filter(data_semeia__lte=data_fim)

    total_sementes = registros.aggregate(Sum('qtd_sementes_utilizada'))['qtd_sementes_utilizada__sum'] or 0
    context = {
        'records': registros,
        'user_info': user_info,
        'request': request,
        'total_sementes': total_sementes,
    }
    return render(request, 'relatorios/relatorio_geral_semeadura.html', context)

def relatorio_geral_semeadura_pdf(request):
    hoje = timezone.now().date()
    registros = Semeadura.objects.all()

    periodo = request.GET.get('periodo')
    data_inicio = request.GET.get('inicio')
    data_fim = request.GET.get('fim')

    if periodo == 'hoje':
        registros = registros.filter(data_semeia=hoje)
    elif periodo == 'semana':
        segunda = hoje - timedelta(days=hoje.weekday())
        domingo = segunda + timedelta(days=6)
        registros = registros.filter(data_semeia__range=[segunda, domingo])
    elif periodo == 'mes':
        registros = registros.filter(data_semeia__year=hoje.year, data_semeia__month=hoje.month)
    elif periodo == 'ano':
        registros = registros.filter(data_semeia__year=hoje.year)

    if data_inicio:
        registros = registros.filter(data_semeia__gte=data_inicio)
    if data_fim:
        registros = registros.filter(data_semeia__lte=data_fim)

    context = {
        'records': registros,
        'request': request,
        'monday': '',
        'sunday': '',
    }

    html_string = render_to_string('relatorios/relatorio_semanal_semeadura_pdf.html', context)
    pdf_file = HTML(string=html_string).write_pdf(stylesheets=[CSS(string='@page { size: A4; margin: 20px; }')])

    response = HttpResponse(pdf_file, content_type='application/pdf')
    response['Content-Disposition'] = 'inline; filename="relatorio_geral_semeadura.pdf"'
    return response

def relatorio_geral_repique(request):
    user_info = get_user_info(request.user.id)
    hoje = timezone.now().date()
    periodo = request.GET.get('periodo')
    data_inicio = request.GET.get('inicio')
    data_fim = request.GET.get('fim')

    registros = Repique.objects.all()

    if periodo == 'hoje':
        registros = registros.filter(data_repique=hoje)
    elif periodo == 'semana':
        segunda = hoje - timedelta(days=hoje.weekday())
        domingo = segunda + timedelta(days=6)
        registros = registros.filter(data_repique__range=[segunda, domingo])
    elif periodo == 'mes':
        registros = registros.filter(data_repique__year=hoje.year, data_repique__month=hoje.month)
    elif periodo == 'ano':
        registros = registros.filter(data_repique__year=hoje.year)

    if data_inicio:
        registros = registros.filter(data_repique__gte=data_inicio)
    if data_fim:
        registros = registros.filter(data_repique__lte=data_fim)

    total_repiques = registros.aggregate(Sum('quantidade_repicada'))['quantidade_repicada__sum'] or 0

    context = {
        'records': registros,
        'total_repiques': total_repiques,
        'user_info': user_info,
        'request': request,
    }
    return render(request, 'relatorios/relatorio_geral_repique.html', context)

def relatorio_geral_repique_pdf(request):
    hoje = timezone.now().date()
    periodo = request.GET.get('periodo')
    data_inicio = request.GET.get('inicio')
    data_fim = request.GET.get('fim')

    registros = Repique.objects.all()

    if periodo == 'hoje':
        registros = registros.filter(data_repique=hoje)
    elif periodo == 'semana':
        segunda = hoje - timedelta(days=hoje.weekday())
        domingo = segunda + timedelta(days=6)
        registros = registros.filter(data_repique__range=[segunda, domingo])
    elif periodo == 'mes':
        registros = registros.filter(data_repique__year=hoje.year, data_repique__month=hoje.month)
    elif periodo == 'ano':
        registros = registros.filter(data_repique__year=hoje.year)

    if data_inicio:
        registros = registros.filter(data_repique__gte=data_inicio)
    if data_fim:
        registros = registros.filter(data_repique__lte=data_fim)

    total_repiques = registros.aggregate(Sum('quantidade_repicada'))['quantidade_repicada__sum'] or 0

    context = {
        'records': registros,
        'total_repiques': total_repiques,
        'request': request,
        'user_info': get_user_info(request.user.id),
    }

    html_string = render_to_string('relatorios/relatorio_semanal_repique_pdf.html', context)
    pdf_file = HTML(string=html_string).write_pdf(
        stylesheets=[CSS(string='@page { size: A4; margin: 20px; }')]
    )

    response = HttpResponse(pdf_file, content_type='application/pdf')
    response['Content-Disposition'] = 'inline; filename="relatorio_geral_repique.pdf"'
    return response



def get_distinct_years():
    return Selecao.objects.filter(data_selecao__isnull=False).dates('data_selecao', 'year', order='ASC')

def get_month_list_data(year):
    distinct_months = (
        Selecao.objects
        .filter(data_selecao__year=year)
        .dates('data_selecao', 'month', order='ASC')
    )
    return [{'number': dt.month, 'name': MESES_PT[dt.month]} for dt in distinct_months]

def relatorio_geral_estufa(request, year=None, month=None):
    user_info = get_user_info(request.user.id)
    hoje = timezone.now().date()
    periodo = request.GET.get('periodo')
    data_inicio = request.GET.get('inicio')
    data_fim = request.GET.get('fim')

    registros = Selecao.objects.all()

    if periodo == 'hoje':
        registros = registros.filter(data_selecao=hoje)
    elif periodo == 'semana':
        segunda = hoje - timedelta(days=hoje.weekday())
        domingo = segunda + timedelta(days=6)
        registros = registros.filter(data_selecao__range=[segunda, domingo])
    elif periodo == 'mes':
        registros = registros.filter(data_selecao__year=hoje.year, data_selecao__month=hoje.month)
    elif periodo == 'ano':
        registros = registros.filter(data_selecao__year=hoje.year)

    if data_inicio:
        registros = registros.filter(data_selecao__gte=data_inicio)
    if data_fim:
        registros = registros.filter(data_selecao__lte=data_fim)

    total_selecao = registros.aggregate(Sum('quantidade_selecao'))['quantidade_selecao__sum'] or 0

    context = {
        'records': registros,
        'user_info': user_info,
        'request': request,
        'total_selecao': total_selecao
    }
    return render(request, 'relatorios/relatorio_geral_estufa.html', context)

def relatorio_geral_estufa_pdf(request):
    user_info = get_user_info(request.user.id)
    hoje = timezone.now().date()

    periodo = request.GET.get('periodo')
    data_inicio = request.GET.get('inicio')
    data_fim = request.GET.get('fim')

    records = Selecao.objects.all()

    if periodo == 'hoje':
        records = records.filter(data_selecao=hoje)
    elif periodo == 'semana':
        segunda = hoje - timedelta(days=hoje.weekday())
        domingo = segunda + timedelta(days=6)
        records = records.filter(data_selecao__range=[segunda, domingo])
    elif periodo == 'mes':
        records = records.filter(data_selecao__year=hoje.year, data_selecao__month=hoje.month)
    elif periodo == 'ano':
        records = records.filter(data_selecao__year=hoje.year)

    if data_inicio:
        records = records.filter(data_selecao__gte=data_inicio)
    if data_fim:
        records = records.filter(data_selecao__lte=data_fim)

    total_selecao = records.aggregate(Sum('quantidade_selecao'))['quantidade_selecao__sum'] or 0

    context = {
        'records': records,
        'request': request,
        'total_selecao': total_selecao,
        'user_info': user_info,
    }

    html_string = render_to_string('relatorios/relatorio_semanal_estufa_pdf.html', context)
    pdf_file = HTML(string=html_string).write_pdf(stylesheets=[CSS(string='@page { size: A4; margin: 20px; }')])

    response = HttpResponse(pdf_file, content_type='application/pdf')
    response['Content-Disposition'] = 'inline; filename="relatorio_geral_estufa.pdf"'
    return response




def consulta_repiques(request):
    user_info = get_user_info(request.user.id)
    funcionarios = Funcionario.objects.filter(cargo__nome__iexact='Repique')

    repiques = Repique.objects.select_related('funcionario', 'semeadura')

    funcionario_id = request.GET.get('funcionario')
    data_inicio = request.GET.get('inicio')
    data_fim = request.GET.get('fim')

    if funcionario_id:
        repiques = repiques.filter(funcionario_id=funcionario_id)

    if data_inicio:
        repiques = repiques.filter(data_repique__gte=data_inicio)

    if data_fim:
        repiques = repiques.filter(data_repique__lte=data_fim)

    agrupado = repiques.values(
        'semeadura__numero_muda',
        'semeadura__lote__numero_lote',
        'semeadura__lote__especie__nome_popular',
        'semeadura__lote__especie__especies',
        'funcionario__nome_completo'
    ).annotate(
        total_repicado=Sum('quantidade_repicada'),
        ultima_data=Max('data_repique')
    ).order_by('-ultima_data')

    total_geral = sum([item['total_repicado'] for item in agrupado])

    return render(request, 'relatorios/consulta_repiques.html', {
    'repiques': agrupado,
    'funcionarios': funcionarios,
    'user_info': user_info,
    'total_geral': total_geral,
})