from django.template.loader import render_to_string
from django.http import HttpResponseBadRequest
from reportlab.platypus import SimpleDocTemplate, Table, TableStyle, Paragraph, Spacer
from reportlab.lib.units import mm
from reportlab.platypus import Table, TableStyle, Paragraph
from reportlab.lib.styles import getSampleStyleSheet, ParagraphStyle
from django.http import HttpResponse
from reportlab.pdfgen import canvas
from collections import defaultdict
from django.http import HttpResponseRedirect
from django.urls import reverse
from reportlab.platypus import SimpleDocTemplate, Table, TableStyle, Paragraph
from django.db.models import Subquery, OuterRef, Sum, Max, Exists
from django.contrib.staticfiles.storage import staticfiles_storage
from reportlab.platypus import SimpleDocTemplate, Paragraph, Spacer, Table, TableStyle, Image
from django.shortcuts import get_object_or_404
from reportlab.platypus import SimpleDocTemplate, Table, TableStyle
from reportlab.lib import colors
from io import BytesIO
from reportlab.lib.styles import getSampleStyleSheet
from reportlab.platypus import SimpleDocTemplate, Paragraph
from reportlab.lib.pagesizes import letter
import json
from django.shortcuts import render
from django.shortcuts import render, redirect, get_object_or_404
from apps.dashboard.utils import get_user_info
from django.contrib import messages
from apps.lotes.models import Semeadura
from apps.saidas.forms import SaidasForm, CadastrarProtocolo, SaidasEspeciesForm
from apps.saidas.models import Saidas, CadastroSaida, SaidasEspecies
from apps.estufa.models import Estufa, Selecao
from apps.clientes.models import EmpresasModels, ClientesModels
from apps.aclimatacao.models import Aclimatacao
from apps.repique.models import Repique
from django.db.models import Sum, Max
from django.http import JsonResponse
from django.db.models import Sum, OuterRef, Exists, Subquery
from django.utils.safestring import mark_safe
from datetime import datetime
from django.views.decorators.csrf import csrf_exempt
from django.http import HttpResponseNotFound  # Adicionando esta linha
from decimal import Decimal
from apps.protocolos.models import ProtocoloSemeadura, Protocolo, ProtocoloFinalizado, ProtocoloSemeaduraFinalizado
from django.shortcuts import redirect
from django.views.decorators.http import require_POST
from django.db.models import Q



def get_lista_saidas_data():
    semeaduras = Semeadura.objects.annotate(
        total_saida=Sum('saidas__quantidade_saidas'),
        total_venda=Sum('saidasespecies__qtd_especie'),
        total_repique=Subquery(
            Repique.objects.filter(
                semeadura=OuterRef('pk')
            ).values('semeadura').annotate(
                total_repique=Sum('quantidade_repicada')
            ).values('total_repique')[:1]
        ),
        total_mortalidade_estufa=Subquery(
            Estufa.objects.filter(
                semeadura=OuterRef('pk')
            ).values('semeadura').annotate(
                total_mortalidade=Sum('quantidade_mortalidade')
            ).values('total_mortalidade')[:1]
        ),
        total_quantidade_selecao=Subquery(
            Selecao.objects.filter(
                semeadura=OuterRef('pk'),
                quantidade_selecao__gt=0
            ).values('semeadura').annotate(
                total_selecao=Sum('quantidade_selecao')
            ).values('total_selecao')[:1]
        ),
        ultima_data_saida=Max('saidas__data_saidas')
    ).filter(
        Exists(
            Selecao.objects.filter(
                semeadura=OuterRef('pk'),
                quantidade_selecao__gt=0
            )
        ),
        ~Exists(
            Saidas.objects.filter(
                semeadura=OuterRef('pk'),
                finalizado=True
            )
        ),
        ~Exists(
            ProtocoloSemeaduraFinalizado.objects.filter(
                semeadura=OuterRef('pk'),
                finalizado=True
            )
        )
    ).select_related('lote__especie')

    saidas = []

    for semeadura in semeaduras:
        qtd_especie = ProtocoloSemeadura.objects.filter(semeadura=semeadura).aggregate(total_qtd_especie=Sum('qtd_especie'))['total_qtd_especie'] or 0
        quantidade_selecao = Selecao.objects.filter(semeadura=semeadura).aggregate(total_quantidade_selecao=Sum('quantidade_selecao'))['total_quantidade_selecao'] or 0
        semeadura.diferenca_qtd = quantidade_selecao - qtd_especie

        # Desmarca a opção de venda se diferenca_qtd for igual a 0
        if semeadura.diferenca_qtd == 0:
            selecoes = Selecao.objects.filter(semeadura=semeadura, venda=True)
            for selecao in selecoes:
                selecao.venda = False
                selecao.save()
            continue

        selecoes = Selecao.objects.filter(semeadura=semeadura).order_by('-data_selecao')
        venda = selecoes.first().venda if selecoes.exists() else False

        saidas_data = []
        saidas_quantidades = []
        saidas_ids = []
        saidas_finalizado = []

        saidas_queryset = semeadura.saidas.filter(finalizado=False)

        for saida in saidas_queryset:
            saidas_data.append(saida.data_saida.strftime('%d/%m/%Y'))
            saidas_quantidades.append(str(saida.quantidade_saidas))
            saidas_ids.append(saida.id)
            saidas_finalizado.append(saida.finalizado)

        saidas_data = saidas_data if saidas_data else [""]
        saidas_quantidades = saidas_quantidades if saidas_quantidades else [""]
        saidas_ids = saidas_ids if saidas_ids else [""]

        saidas.append({
            'semeadura_id': semeadura.id,
            'numero_muda': semeadura.numero_muda,
            'data_semeia': semeadura.data_semeia,
            'nome_popular': semeadura.lote.especie.nome_popular,
            'especies': semeadura.lote.especie.especies,
            'ultima_data_saida': semeadura.ultima_data_saida,
            'total_saida': semeadura.total_saida,
            'total_repique': int(semeadura.total_repique) if semeadura.total_repique is not None else 0,
            'total_mortalidade_estufa': semeadura.total_mortalidade_estufa,
            'saida_venda': venda,
            'saida_dates': saidas_data,
            'saida_quantities': saidas_quantidades,
            'saida_ids': saidas_ids,
            'finalizado': saidas_finalizado,
            'estimativa_minima': semeadura.lote.estimativa_minima,
            'estimativa_maxima': semeadura.lote.estimativa_maxima,
            'estimativa_media': semeadura.lote.estimativa_minima,
            'qtd_sementes_utilizada': semeadura.qtd_sementes_utilizada,
            'total_quantidade_selecao': semeadura.total_quantidade_selecao,
            'total_qtd_especie': semeadura.total_venda,
            'diferenca_qtd': semeadura.diferenca_qtd,
        })

    return {'semeaduras': semeaduras, 'saidas': saidas}


def get_lista_saidas_completa_data():
    semeaduras = Semeadura.objects.annotate(
        total_saida=Sum('saidas__quantidade_saidas'),
        total_venda=Sum('saidasespecies__qtd_especie'),
        total_repique=Subquery(
            Repique.objects.filter(
                semeadura=OuterRef('pk')
            ).values('semeadura').annotate(
                total_repique=Sum('quantidade_repicada')
            ).values('total_repique')[:1]
        ),
        total_mortalidade_estufa=Subquery(
            Estufa.objects.filter(
                semeadura=OuterRef('pk')
            ).values('semeadura').annotate(
                total_mortalidade=Sum('quantidade_mortalidade')
            ).values('total_mortalidade')[:1]
        ),
        total_quantidade_selecao=Subquery(
            Selecao.objects.filter(
                semeadura=OuterRef('pk'),
                quantidade_selecao__gt=0
            ).values('semeadura').annotate(
                total_selecao=Sum('quantidade_selecao')
            ).values('total_selecao')[:1]
        ),
        ultima_data_saida=Max('saidas__data_saidas')
    ).select_related('lote__especie')

    saidas = []


    for semeadura in semeaduras:
        selecoes = Selecao.objects.filter(semeadura=semeadura).order_by('-data_selecao')
        venda = selecoes.first().venda if selecoes.exists() else False
        qtd_especie = ProtocoloSemeadura.objects.filter(semeadura=semeadura).aggregate(total_qtd_especie=Sum('qtd_especie'))['total_qtd_especie'] or 0

        saidas_data = []
        saidas_quantidades = []
        saidas_ids = []
        finalizado = False

        saidas_queryset = semeadura.saidas.all()

        for saida in saidas_queryset:
            saidas_data.append(saida.data_saida.strftime('%d/%m/%Y'))
            saidas_quantidades.append(str(saida.quantidade_saidas))
            saidas_ids.append(saida.id)
            if saida.finalizado:
                finalizado = True

        # Verificar se a semeadura está marcada como finalizada em ProtocoloSemeaduraFinalizado
        if ProtocoloSemeaduraFinalizado.objects.filter(semeadura=semeadura, finalizado=True).exists():
            finalizado = True

        saidas_data = saidas_data if saidas_data else [""]
        saidas_quantidades = saidas_quantidades if saidas_quantidades else [""]
        saidas_ids = saidas_ids if saidas_ids else [""]

        saidas.append({
            'semeadura_id': semeadura.id,
            'numero_muda': semeadura.numero_muda,
            'data_semeia': semeadura.data_semeia,
            'nome_popular': semeadura.lote.especie.nome_popular,
            'especies': semeadura.lote.especie.especies,
            'ultima_data_saida': semeadura.ultima_data_saida,
            'total_saida': semeadura.total_saida,
            'total_repique': int(semeadura.total_repique) if semeadura.total_repique is not None else 0,
            'total_mortalidade_estufa': semeadura.total_mortalidade_estufa,
            'saida_venda': venda,
            'saida_dates': saidas_data,
            'saida_quantities': saidas_quantidades,
            'saida_ids': saidas_ids,
            'finalizado': finalizado,
            'estimativa_minima': semeadura.lote.estimativa_minima,
            'estimativa_maxima': semeadura.lote.estimativa_maxima,
            'estimativa_media': semeadura.lote.estimativa_minima,
            'qtd_sementes_utilizada': semeadura.qtd_sementes_utilizada,
            'total_quantidade_selecao': semeadura.total_quantidade_selecao,
            'total_qtd_especie': semeadura.total_venda,
            'qtd_especie': qtd_especie,
        })

    return {'semeaduras': semeaduras, 'saidas': saidas}


def marcar_venda(request, semeadura_id):
    # Busca todas as Selecao relacionadas à Semeadura especificada
    selecoes = Selecao.objects.filter(semeadura_id=semeadura_id)
    
    if not selecoes:
        return redirect('lista_saidas')  # Ou alguma resposta de erro, se preferir
    
    # Verifica se a semeadura está finalizada
    semeadura_finalizada = ProtocoloSemeaduraFinalizado.objects.filter(semeadura_id=semeadura_id, finalizado=True).exists()

    if semeadura_finalizada:
        return redirect('lista_saidas')  # Não permite marcar venda para semeaduras finalizadas
    
    # Atualiza o estado de venda para cada Selecao encontrada
    for selecao in selecoes:
        selecao.venda = not selecao.venda
        selecao.save()
    
    return redirect('lista_saidas')
    
@require_POST
def desmarcar_venda(request):
    # Busca todas as seleções marcadas como venda
    selecoes_venda = Selecao.objects.filter(venda=True)

    # Desmarcar todas as seleções marcadas como venda
    selecoes_venda.update(venda=False)

    return redirect('lista_saidas')

def get_lista_empresas(request):
    empresas = EmpresasModels.objects.all()
    empresas_data = []

    for empresa in empresas:
        empresas_data.append({
            'empresa_id': empresa.id,
            'cnpj': empresa.cnpj,
            'inscricao_estadual': empresa.inscricao_estadual,
            'razao_social': empresa.razao_social,
            'nome_fantasia': empresa.nome_fantasia,
            'email': empresa.email,
            'uf': empresa.uf,
            'cidade': empresa.cidade,
            'endereco': empresa.endereco,
            'bairro': empresa.bairro,
            'complemento': empresa.complemento,
            'cep': empresa.cep,
            'telefone_celular': empresa.telefone_celular,
            'telefone_residencial': empresa.telefone_residencial,
            'nome_responsavel': empresa.nome_responsavel,
            'contato_responsavel': empresa.contato_responsavel,
            # Adicione outros campos da EmpresasModels conforme necessário
        })

    return JsonResponse({'empresas': empresas_data})


def get_lista_clientes(request):
    clientes = ClientesModels.objects.all()
    clientes_data = []

    for cliente in clientes:
        clientes_data.append({
            'cliente_id': cliente.id,
            'nome': cliente.nome_completo,
            'cpf': cliente.cpf,
            'email': cliente.email,
            'uf': cliente.uf,
            'cidade': cliente.cidade,
            'endereco': cliente.endereco,
            'bairro': cliente.bairro,
            'complemento': cliente.complemento,
            'cep': cliente.cep,
            'telefone_celular': cliente.telefone_celular,
            'telefone_residencial': cliente.telefone_residencial,
            # Adicione outros campos da EmpresasModels conforme necessário
        })

    return JsonResponse({'clientes': clientes_data})


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

    user_info = get_user_info(request.user.id)
    lista_saidas_data = get_lista_saidas_data()
    lista_saidas_data["user_info"] = user_info

    return render(request, 'saidas/lista_saidas.html', lista_saidas_data)


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

    user_info = get_user_info(request.user.id)
    lista_saidas_completa_data = get_lista_saidas_completa_data()
    lista_saidas_completa_data["user_info"] = user_info

    return render(request, 'saidas/lista_saidas_completa.html', lista_saidas_completa_data)


def saidas(request, semeadura_id):
    semeadura = get_object_or_404(Semeadura, pk=semeadura_id)

    if request.method == 'POST':
        form = SaidasForm(request.POST)
        if form.is_valid():
            saidas = form.save(commit=False)
            saidas.semeadura = semeadura
            saidas.save()
            messages.success(request, mark_safe(
                '<i class="fa-solid fa-circle-check"></i><strong class="mx-1">Sucesso!</strong> Saida registrada com êxito.'))
            return redirect('lista_saidas')
    else:
        form = SaidasForm()

    return render(request, 'saidas.html', {'form': form, 'semeadura': semeadura})


def excluir_saidas(request, saidas_id):
    if request.method == 'POST' and request.headers.get('x-requested-with') == 'XMLHttpRequest':
        try:
            # Tente obter o repique com o ID fornecido
            saidas = Saidas.objects.get(pk=saidas_id)

            # Verifique se o repique existe antes de excluí-lo
            if saidas:
                messages.success(request, mark_safe(
                    '<i class="fa-solid fa-circle-check"></i><strong class="mx-1">Sucesso!</strong> Saida excluida com êxito.'))
                saidas.delete()
                return JsonResponse({'message': 'Saídas excluído com sucesso.'})
            else:
                return JsonResponse({'message': 'Saídas não encontrado.'}, status=404)
        except Exception as e:
            return JsonResponse({'message': f'Erro ao excluir Saídas: {str(e)}'}, status=500)

    return JsonResponse({'message': 'Método de solicitação inválido ou não é uma solicitação AJAX.'}, status=400)


def finalizar_saidas(request, semeadura_id):
    # Encontre todos os repiques com o semeadura_id fornecido
    saidas = Saidas.objects.filter(semeadura_id=semeadura_id)

    # Lógica para finalizar os repiques
    saidas.update(finalizado=True)
    messages.success(request, mark_safe(
        '<i class="fa-solid fa-circle-check"></i><strong class="mx-1">Sucesso!</strong> Saida finalizada com êxito.'))

    return redirect('lista_saidas')


def salvar_protocolo_empresa(form, empresa_id):
    empresa = get_object_or_404(EmpresasModels, pk=empresa_id)
    ano_atual = datetime.now().year
    proximo_numero_protocolo = CadastroSaida.objects.count() + 1
    numero_protocolo_com_ano = f"{proximo_numero_protocolo}/{ano_atual}"

    novo_protocolo = CadastroSaida(
        numero_protocolo=proximo_numero_protocolo,
        referente_nf=form.cleaned_data['referente_nf'],
        empresa=empresa.razao_social,
        end=empresa.endereco,
        cidade=empresa.cidade,
        email=empresa.email,
        tel=empresa.telefone_celular,
        cpf_cnpj=empresa.cnpj,
        cep=empresa.cep,
        inscricao_estadual=empresa.inscricao_estadual,
        tipo_pagamento=form.cleaned_data['tipo_pagamento'],
        numero_pedido=form.cleaned_data['numero_pedido'],
        destino_mudas=form.cleaned_data['destino_mudas'],
        placa=form.cleaned_data['placa'],
        responsavel_recebimento=form.cleaned_data['responsavel_recebimento'],
        produtor=form.cleaned_data['produtor'],
        renasem_produtor=form.cleaned_data['renasem_produtor'],
        responsavel_tecnico=form.cleaned_data['responsavel_tecnico'],
        renasem_tecnico=form.cleaned_data['renasem_tecnico'],
    )
    novo_protocolo.save()

    return novo_protocolo.id  # Retorna o ID do protocolo salvo


def salvar_protocolo_cliente(form, cliente_id):
    cliente = get_object_or_404(ClientesModels, pk=cliente_id)
    ano_atual = datetime.now().year
    proximo_numero_protocolo = CadastroSaida.objects.count() + 1
    numero_protocolo_com_ano = f"{proximo_numero_protocolo}/{ano_atual}"

    novo_protocolo = CadastroSaida(
        numero_protocolo=proximo_numero_protocolo,
        referente_nf=form.cleaned_data['referente_nf'],
        cliente=cliente.nome_completo,
        end=cliente.endereco,
        cidade=cliente.cidade,
        email=cliente.email,
        tel=cliente.telefone_celular,
        cpf_cnpj=cliente.cpf,
        cep=cliente.cep,
        tipo_pagamento=form.cleaned_data['tipo_pagamento'],
        numero_pedido=form.cleaned_data['numero_pedido'],
        destino_mudas=form.cleaned_data['destino_mudas'],
        placa=form.cleaned_data['placa'],
        responsavel_recebimento=form.cleaned_data['responsavel_recebimento'],
        produtor=form.cleaned_data['produtor'],
        renasem_produtor=form.cleaned_data['renasem_produtor'],
        responsavel_tecnico=form.cleaned_data['responsavel_tecnico'],
        renasem_tecnico=form.cleaned_data['renasem_tecnico'],
    )
    novo_protocolo.save()

    return novo_protocolo.id  # Retorna o ID do protocolo salvo


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

    if request.method == 'POST':
        form = CadastrarProtocolo(request.POST)
        if form.is_valid():
            tipo_escolhido = form.cleaned_data['tipo_escolhido']

            if tipo_escolhido == 'empresa':
                protocolo_id = salvar_protocolo_empresa(
                    form, form.cleaned_data['empresa'])
            else:
                protocolo_id = salvar_protocolo_cliente(
                    form, form.cleaned_data['cliente'])

            # Redireciona para a view itens_protocolo com o protocolo_id como parte da URL
            return HttpResponseRedirect(reverse('itens_protocolo', kwargs={'protocolo_id': protocolo_id}))

    else:
        form = CadastrarProtocolo()

    empresas_response = get_lista_empresas(request)
    empresas_content = empresas_response.content.decode('utf-8')
    empresas_data = json.loads(empresas_content).get('empresas', [])

    clientes_response = get_lista_clientes(request)
    clientes_content = clientes_response.content.decode('utf-8')
    clientes_data = json.loads(clientes_content).get('clientes', [])

    lista_saidas_data = get_lista_saidas_data()

    # Recuperar os últimos 5 registros de SaidasEspecies com os dados relacionados de CadastroSaida
    saidas_especies = SaidasEspecies.objects.select_related(
        'cadastrosaida').order_by('id')

    # Criar um dicionário para armazenar os últimos registros únicos de acordo com o número do protocolo
    ultimos_registros_por_protocolo = defaultdict(lambda: None)

    for saida_especie in saidas_especies:
        numero_protocolo = saida_especie.cadastrosaida.numero_protocolo
        # Adicionar o registro se ele ainda não estiver presente no dicionário
        if not ultimos_registros_por_protocolo[numero_protocolo]:
            ultimos_registros_por_protocolo[numero_protocolo] = saida_especie

    # Converter o dicionário em uma lista de valores
    ultimos_registros = list(ultimos_registros_por_protocolo.values())

    context = {
        'user_info': get_user_info(request.user.id),
        'form': form,
        'empresas': empresas_data,
        'clientes': clientes_data,
        # Passar os últimos registros para o contexto
        'ultimos_registros': ultimos_registros,
        **lista_saidas_data,
    }

    return render(request, 'saidas/protocolo.html', context)


def itens_protocolo(request, protocolo_id):
    if not request.user.is_authenticated:
        return redirect('index')

    lista_saidas_data = get_lista_saidas_data()

    # Supondo que lista_saidas_data contém uma chave 'saidas' com os itens desejados
    saidas_filtradas = [saida for saida in lista_saidas_data['saidas'] if saida['saida_venda']]

    context = {
        'user_info': get_user_info(request.user.id),
        'protocolo_id': protocolo_id,
        'saidas': saidas_filtradas,  # Use a lista filtrada
    }

    return render(request, 'saidas/itens_protocolo.html', context)


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

    lista_saidas_data = get_lista_saidas_data()
    saidas_especies = SaidasEspecies.objects.select_related('cadastrosaida')

    # Lógica existente para obter os últimos registros únicos
    ultimos_registros_por_protocolo = defaultdict(lambda: None)
    for saida_especie in saidas_especies:
        numero_protocolo = saida_especie.cadastrosaida.numero_protocolo
        if not ultimos_registros_por_protocolo[numero_protocolo]:
            ultimos_registros_por_protocolo[numero_protocolo] = saida_especie

    # Nova lógica para calcular a soma de qtd_especie por protocolo
    total_qtd_especie_por_protocolo = SaidasEspecies.objects.values('cadastrosaida__numero_protocolo').annotate(total_qtd_especie=Sum('qtd_especie')).order_by()

    # Transformar o resultado em um dicionário para fácil acesso
    total_qtd_dict = {item['cadastrosaida__numero_protocolo']: item['total_qtd_especie'] for item in total_qtd_especie_por_protocolo}

    # Adicionando a informação de soma ao contexto, para uso no template
    for saida_especie in ultimos_registros_por_protocolo.values():
        numero_protocolo = saida_especie.cadastrosaida.numero_protocolo
        # Aqui você adiciona a soma de qtd_especie ao objeto de saida_especie, como um novo atributo
        setattr(saida_especie, 'total_qtd_especie', total_qtd_dict.get(numero_protocolo, 0))
        setattr(saida_especie, 'cadastrosaida_id', saida_especie.cadastrosaida.id)  # Adicione esta linha para incluir cadastrosaida_id

    ultimos_registros = list(ultimos_registros_por_protocolo.values())

    context = {
        'user_info': get_user_info(request.user.id),
        'ultimos_registros': ultimos_registros,
        **lista_saidas_data,
    }

    return render(request, 'saidas/lista_protocolos.html', context)



@csrf_exempt
def salvar_tabela(request, protocolo_id):
    if request.method == 'POST':
        try:
            data = json.loads(request.POST.get('dados'))
            print("Dados recebidos:", data)

            protocolo = get_object_or_404(CadastroSaida, id=protocolo_id)
            semeadura_ids = set()  # Utilize um conjunto para armazenar os IDs únicos de semeadura

            for row in data:
                semeadura_id = row.get('semeadura_id')
                if semeadura_id:
                    semeadura_ids.add(semeadura_id)
                    Semeadura.objects.get(id=semeadura_id)  # Apenas para verificar se a semeadura existe

                    SaidasEspecies.objects.create(
                        cadastrosaida=protocolo,
                        semeadura_id=semeadura_id,
                        numero_lote=row['numero_lote'],
                        nome_popular=row['nome_popular'],
                        nome_cientifico=row['nome_cientifico'],
                        qtd_especie=row['qtd_especie'],
                        valor_uni=row['valor_uni'],
                        valor_total=row['valor_total'],
                        categoria=row['categoria'],
                    )
                    print("Dados salvos:", row)

            # Após salvar, altera o status de venda para os semeadura_ids processados
            for semeadura_id in semeadura_ids:
                alterar_status_venda(semeadura_id)

            messages.success(request, 'Dados salvos com sucesso!')
            return JsonResponse({'redirect_url': '/lista_protocolos/'})  # Ajuste para a URL desejada

        except Exception as e:
            print("Erro ao salvar no banco de dados:", e)
            return JsonResponse({'message': 'Erro ao salvar no banco de dados', 'status': 'error'}, status=500)

    return JsonResponse({'message': 'Método não permitido', 'status': 'error'}, status=405)

def alterar_status_venda(semeadura_id):
    # Sua lógica de negócios para alterar o status de venda
    selecoes = Selecao.objects.filter(semeadura_id=semeadura_id, venda=True)
    for selecao in selecoes:
        selecao.venda = False
        selecao.save()


def editar_tabela(request, cadastrosaida_id):
    # Obtendo todos os itens da lista com o cadastrosaida_id especificado
    full =  get_lista_saidas_data()
    itens_lista = SaidasEspecies.objects.filter(cadastrosaida_id=cadastrosaida_id)

    

    # Verificando se o usuário está autenticado
    if not request.user.is_authenticated:
        return redirect('index')

    user_info = get_user_info(request.user.id)

    if request.method == 'POST':
        try:
            # Tente obter o objeto SaidasEspecies com base no cadastrosaida_id
            item = SaidasEspecies.objects.get(cadastrosaida_id=cadastrosaida_id)
        except SaidasEspecies.DoesNotExist:
            return HttpResponseNotFound("Objeto não encontrado")

        # Se o formulário for enviado com dados, instancia o formulário com os dados recebidos
        form = SaidasEspeciesForm(request.POST, instance=item)
        if form.is_valid():
            form.save()  # Salva as alterações no banco de dados
            # Redireciona para algum lugar após a edição
            return redirect('lista_protocolos')
    else:
        # Se não for um envio de formulário, instancia o formulário sem passar a instância do item_lista
        form = SaidasEspeciesForm()

    # Renderiza o template com o formulário e outras informações necessárias
    return render(request, 'saidas/editar_tabela.html', {"form": form, "itens_lista": itens_lista, **full, "user_info": user_info})


def editar_dados_cliente(request, protocolo_id):
    # Obtendo o item da lista para edição
    dados_cliente = get_object_or_404(CadastroSaida, id=protocolo_id)

    # Verificando se o usuário está autenticado
    if not request.user.is_authenticated:
        return redirect('index')

    user_info = get_user_info(request.user.id)

    if request.method == 'POST':
        # Se o formulário for enviado com dados, instancia o formulário com os dados recebidos
        form = CadastrarProtocolo(request.POST, instance=dados_cliente)
        if form.is_valid():
            form.save()  # Salva as alterações no banco de dados
            # Redireciona para algum lugar após a edição
            return redirect('lista_protocolos')
    else:
        # Se não for um envio de formulário, instancia o formulário com os dados do item_lista
        form = CadastrarProtocolo(instance=dados_cliente)

    # Renderiza o template com o formulário e outras informações necessárias
    return render(request, 'saidas/editar_dados_cliente.html', {"form": form, "dados_cliente": dados_cliente, "user_info": user_info})


def gerar_pdf(request):
    if request.method == 'POST':
        numero_protocolo = request.POST.get('numero_protocolo')

        # Consulta para obter as saídas de espécies relacionadas com seus dados de cadastro
        saidas_especies = SaidasEspecies.objects.select_related('cadastrosaida').filter(
            cadastrosaida__numero_protocolo=numero_protocolo
        )

        # Criar um PDF usando ReportLab
        response = HttpResponse(content_type='application/pdf')
        response['Content-Disposition'] = f'attachment; filename="protocolo_{numero_protocolo}.pdf"'

        data_emissao = datetime.now().strftime("%d/%m/%Y")  # Formato: dd/mm/aaaa

        # Definir as margens da página
        margem_total = 10

        # Criar o PDF com os dados da empresa e as margens definidas
        buffer = BytesIO()
        doc = SimpleDocTemplate(buffer, pagesize=letter, leftMargin=margem_total, rightMargin=margem_total,
                                topMargin=margem_total, bottomMargin=margem_total)

        elements = []

        # Adicionar um espaçador para criar a margem superior
        elements.append(Spacer(1, margem_total))

        # Criando a tabela de dados da empresa
        # Obtém os estilos de amostra
        styles = getSampleStyleSheet()

        # Modifica o estilo padrão para negrito
        styles["Normal"].fontName = "Helvetica"
        lightgray = colors.Color(0.9, 0.9, 0.9)

        # Adicionar a imagem
        imagem_path = staticfiles_storage.path(
            'assets/img/logo-ama-footer.png')
        imagem = Image(imagem_path)
        imagem.drawHeight = 100  # Defina a altura da imagem
        imagem.drawWidth = 100  # Defina a largura da imagem
        # elements.append(imagem)

        data = [
            ['PROTOCOLO DE SAÍDA E VENDA DE MUDAS'],
            [imagem, '', Paragraph(
                "<b>PROTOCOLO N°: </b> " + str(numero_protocolo), styles["Normal"])],
            ['', '',  Paragraph("<b>REFERENTE NF N°: </b> " + str() + (
                 "<br/><br/><b>DATA DE EMISSÃO: </b> " + data_emissao), styles["Normal"])],
        ]
        style = TableStyle([
            # Define a fonte como negrito para todas as células
            ('FONTNAME', (0, 0), (-1, -1), 'Helvetica-Bold'),
            # Adiciona a grade à borda da tabela com largura de 0.5 e cor cinza
            ('GRID', (0, 0), (-1, -1), 0.5, colors.grey),
            # Centraliza todo o conteúdo da tabela
            ('ALIGN', (0, 0), (-1, -1), 'CENTER'),
            # Define o fundo da primeira linha como cinza claro
            ('BACKGROUND', (0, 0), (-1, 0), lightgray),
            # Define o fundo da célula do protocolo comLEFTo verde claro
            ('BACKGROUND', (2, 1), (2, 1), lightgray),
            # Combina as células da linha 0 para cobrir todas as colunas
            ('SPAN', (0, 0), (-1, 0)),
            # Combina as células da coluna 0 e 1, linhas 2 e 3
            ('SPAN', (0, 1), (1, 2)),
            # Centraliza verticalmente todo o conteúdo da tabela
            ('VALIGN', (0, 0), (-1, -1), 'MIDDLE'),
        ])

        # Adicionando a tabela ao documento
        tabela = Table(data, style=style)
        elements.append(tabela)

       # Supondo que saidas_especies é uma instância de SaidasEspecies
        cadastro_saida = saidas_especies[0].cadastrosaida if saidas_especies else None

        if cadastro_saida:
            if hasattr(cadastro_saida, 'cliente') and cadastro_saida.cliente:
                texto_cliente = "<b>CLIENTE: </b>" + cadastro_saida.cliente
            elif hasattr(cadastro_saida, 'empresa') and cadastro_saida.empresa:
                texto_cliente = "<b>CLIENTE: </b>" + cadastro_saida.empresa
            else:
                texto_cliente = ""  # Caso nenhum dos atributos exista
            data1 = [
                [Paragraph(texto_cliente, styles["Normal"]),
                 Paragraph("<b>TEL: </b>" + cadastro_saida.tel, styles["Normal"])],

                [Paragraph("<b>INSCRIÇÃO ESTADUAL: </b>" + cadastro_saida.inscricao_estadual, styles["Normal"]),
                 Paragraph("<b>CPF/CNPJ: </b>" + cadastro_saida.cpf_cnpj, styles["Normal"])],

                [Paragraph("<b>ENDEREÇO: </b>" + cadastro_saida.end, styles["Normal"]),
                 Paragraph("<b>CEP: </b>" + cadastro_saida.cep, styles["Normal"])],

                [Paragraph("<b>CIDADE: </b>" + cadastro_saida.cidade, styles["Normal"]),
                 Paragraph("<b>TIPO PAGT: </b>" + cadastro_saida.tipo_pagamento, styles["Normal"])],

                [Paragraph("<b>E-MAIL: </b>" + cadastro_saida.email, styles["Normal"]),
                 Paragraph("<b>PEDIDO COMPRA N°: </b>" + cadastro_saida.numero_pedido, styles["Normal"])],
            ]
        else:
            # Se não houver cadastro_saida, você pode lidar com isso de acordo com a lógica do seu aplicativo
            data1 = []  # Ou algum outro valor padrão que faça sentido no seu contexto
        style1 = TableStyle([
            ('GRID', (0, 0), (-1, -1), 0.5, colors.grey),
            # Centraliza verticalmente todo o conteúdo da tabela
            ('VALIGN', (0, 0), (-1, -1), 'MIDDLE'),
        ])

        # Criar a segunda tabela
        table1 = Table(data1, style=style1)
        elements.append(table1)

        separators = [
            ['']
        ]
        # Estilos da tabela
        separatorsstyle = TableStyle([
        ])

        # Criar a tabela
        sep = Table(separators, style=separatorsstyle)
        elements.append(sep)

        cadastro_saida = saidas_especies[0].cadastrosaida if saidas_especies else None
        if cadastro_saida:
            data2 = [
                [Paragraph("<b>DESTINO MUDAS: </b>", styles["Normal"]), Paragraph("" + cadastro_saida.destino_mudas, styles["Normal"]), '',
                 ''],  # Texto "DESTINO MUDAS" na primeira célula
            ]
        else:
            # Se não houver cadastro_saida, você pode lidar com isso de acordo com a lógica do seu aplicativo
            data1 = []  # Ou algum outro valor padrão que faça sentido no seu contexto
        # Estilos da tabela
        style2 = TableStyle([
            # Adiciona uma grade à tabela
            ('GRID', (0, 0), (-1, -1), 0.5, colors.grey),
            # Combina a célula ['', ''] para ocupar quatro colunas
            ('SPAN', (1, 0), (3, 0)),
            # Define o fundo da coluna "DESTINO MUDAS" como lightgray
            ('BACKGROUND', (0, 0), (0, 0), lightgray),
            # Centraliza verticalmente todo o conteúdo da tabela
            ('VALIGN', (0, 0), (-1, -1), 'MIDDLE'),
        ])

        # Criar a segunda tabela
        table2 = Table(data2, style=style2)
        elements.append(table2)

        cadastro_saida = saidas_especies[0].cadastrosaida if saidas_especies else None
        if cadastro_saida:
            data3 = [
                [
                    Paragraph("<b>PLACA: </b>", styles["Normal"]),
                    Paragraph("" + cadastro_saida.placa, styles["Normal"]),
                    '',
                    Paragraph("<b>RESPONSÁVEL RECEBIMENTO: </b>",
                              styles["Normal"]),
                    '', '',
                    Paragraph(
                        "" + cadastro_saida.responsavel_recebimento, styles["Normal"]),
                    '', '', '', '',
                ],
            ]
        else:
            data3 = []

        # Estilos da tabela
        style3 = TableStyle([
            # Adiciona uma grade à tabela
            ('GRID', (0, 0), (-1, -1), 0.5, colors.grey),
            # Define a cor de fundo para a coluna 0 como vermelho
            ('BACKGROUND', (0, 0), (0, -1), lightgray),
            # Define a cor de fundo para a coluna 3 como vermelho
            ('BACKGROUND', (3, 0), (3, -1), lightgray),
            # Define a célula da placa para ocupar 3 colunas
            ('SPAN', (1, 0), (2, 0)),
            # Define a célula do responsável pelo recebimento para ocupar 2 colunas à direita
            ('SPAN', (3, 0), (5, 0)),
            # Define a célula com o conteúdo de cadastro_saida.responsavel_recebimento para ocupar 2 colunas à direita
            ('SPAN', (6, 0), (10, 0)),
            # Centraliza verticalmente todo o conteúdo da tabela
            ('VALIGN', (0, 0), (-1, -1), 'MIDDLE'),
        ])

        # Criar a segunda tabela
        table3 = Table(data3, style=style3)
        elements.append(table3)

        separators = [
            ['']
        ]
        # Estilos da tabela
        separatorsstyle = TableStyle([
        ])

        # Criar a tabela
        sep = Table(separators, style=separatorsstyle)
        elements.append(sep)

        data4 = [
            ["<b>N°</b>", "<b>Nome cientifico:</b>", "<b>Nome vulgar:</b>", "<b>N° lote:</b>",
             "<b>Quant. p/ espécie:</b>", "<b>Valor uni:</b>", "<b>Total:</b>"]
        ]

        # Inicialize uma variável para armazenar a soma total
        soma_total = 0
        soma_total_qtd_especie = 0

        # Adiciona a sequência de números na coluna "N"
        for index, saida in enumerate(saidas_especies, start=1):
            row_data = [
                f"<b>{index}</b>",
                f"{saida.nome_cientifico}",
                f"{saida.nome_popular}",
                f"{saida.numero_lote}",
                f"{saida.qtd_especie}",
                f"R$ {float(saida.valor_uni.replace(',', '.')):.2f}",
                # Formatação personalizada com o cifrão à esquerda e o valor à direita
                f"R$ {float(saida.valor_total.replace(',', '.')):.2f}",
            ]
            data4.append(row_data)

            # Adiciona o valor total à soma total após converter para float
            valor_total = saida.valor_total.replace(
                ',', '.')  # Substitui a vírgula por ponto
            soma_total += float(valor_total)

            # Adiciona a quantidade de espécies à soma total após converter para inteiro
            if saida.qtd_especie is not None and saida.qtd_especie != Decimal('0'):
                soma_total_qtd_especie += int(saida.qtd_especie)

            # Defina o estilo da célula
            cell_style = ParagraphStyle(
                'MyCellTextStyle',
                alignment=1,  # 0 = esquerda, 1 = centro, 2 = direita
            )

        # Adiciona a linha de soma total
        soma_total_row = [
            'TOTAL DE MUDAS E VALORES',  # Coluna "N" vazia
            '',  # Coluna "Número do Lote" vazia
            '',  # Coluna "Nome Popular" vazia
            '',  # Coluna "Nome Científico" vazia
            f"<b>{soma_total_qtd_especie}</b>",
            '',  # Coluna "Valor Unitário" vazia
            # Formatação personalizada com o cifrão à esquerda e o valor à direita
            f"<b>R${soma_total:>10.2f}</b>"
        ]
        data4.append(soma_total_row)

        # Estilos da tabela
        # Estilos da tabela
        style4 = TableStyle([
            # Adiciona uma grade à tabela
            ('GRID', (0, 0), (-1, -1), 0.5, colors.grey),
            ('BACKGROUND', (0, 0), (-1, 0), lightgray),
            ('BACKGROUND', (0, 1), (-1, -2), colors.white),

            # Define o alinhamento do texto para todas as células como centralizado
            ('VALIGN', (0, 0), (-1, -1), 'MIDDLE'),
            ('ALIGN', (0, 0), (-1, -1), 'CENTER'),

            ('SPAN', (0, -1), (2, -1)),  # Unir todas as colunas da última linha

        ])

        # Defina a largura das colunas Nome Popular e Nome Científico
        # Defina a largura das colunas conforme necessário
        col_widths = [30, 150, 100, 80, 70, 60, 90]
        # Defina a altura das linhas conforme necessário
        # Aqui você pode definir a altura desejada para cada linha
        row_heights = [35] * len(data4)

        # Convertendo os dados em elementos para a tabela
        table_data = []
        for row in data4:
            formatted_row = []
            for cell in row:
                # Verifica se a célula é uma string não vazia
                if isinstance(cell, str) and cell.strip():
                    formatted_row.append(Paragraph(cell, cell_style))
                else:
                    formatted_row.append(cell)
            table_data.append(formatted_row)

        # Criando a tabela com a largura e altura das colunas definidas
        table4 = Table(table_data, colWidths=col_widths,
                       rowHeights=row_heights, style=style4)
        elements.append(table4)

        # Defina a observação acima das assinaturas
        # Defina a observação acima das assinaturas
        observacao = "Obs: O prazo máximo para a restituição das caixas pertencentes ao viveiro AMA é de sete dias. Os materiais pertencentes ao viveiro devem ser conservados e devolvidos na exata quantidade enviada, sendo de responsabilidade do cliente assegurar a integralidade deste processo. Na ausência da devolução, será aplicada uma taxa de R$ 70,00 por cada unidade de caixa não restituída."

        # Estilo de parágrafo para a observação
        paragrafo_observacao_style = ParagraphStyle(
            name='Observacao',
            spaceBefore=50,  # Espaçamento superior de 10 pontos
        )

        # Parágrafo para a observação
        paragrafo_observacao = Paragraph(
            observacao, paragrafo_observacao_style)
        # Wrap para calcular a largura e altura do parágrafo
        paragrafo_observacao.wrapOn(doc, 500, 100)
        paragrafo_observacao._leading = 20  # Aumenta o espaço entre as linhas

        altura_linha_cliente = 100

        # Estilo de parágrafo para centralizar o texto na célula da tabela
        cell_style = ParagraphStyle(
            name='TableCell',
            alignment=1,  # 0 = Esquerda, 1 = Centro, 2 = Direita
            fontSize=10,
        )

        # Linha para assinatura do CLIENTE
        linha_assinatura_cliente = Table(
            [
                [Paragraph(
                    "x___________________________________________________________", styles["Normal"])],
                # Linha com o texto "ASSINATURA CLIENTE"
                [Paragraph("ASSINATURA CLIENTE", cell_style)],
            ],
            colWidths=[350],
            # Altura da linha de assinatura e da linha "ASSINATURA CLIENTE"
            rowHeights=[altura_linha_cliente, 20],
            hAlign='CENTER',  # Centralizar horizontalmente a linha
            vAlign='MIDDLE'  # Centralizar verticalmente a linha
        )

        # Adicione a observação acima das linhas de assinatura
        elements.append(paragrafo_observacao)

        elements.append(linha_assinatura_cliente)

        # Adicione a lista de elementos ao documento
        doc.build(elements)

        # Retornar o PDF como uma resposta HTTP
        pdf = buffer.getvalue()
        buffer.close()
        response.write(pdf)
        return response

    else:
        # Se a solicitação não for POST, retorne um HttpResponse vazio
        return HttpResponse()
    
def gerar_pdf_termo_conformidade(request):
    if request.method == 'POST':
        numero_protocolo = request.POST.get('numero_protocolo')

        saidas_especies = SaidasEspecies.objects.select_related('cadastrosaida').filter(
            cadastrosaida__numero_protocolo=numero_protocolo
        )

        # Criar um PDF usando ReportLab
        response = HttpResponse(content_type='application/pdf')
        response['Content-Disposition'] = f'attachment; filename="protocolo_{numero_protocolo}.pdf"'

        data_emissao = datetime.now().strftime("%d/%m/%Y")  # Formato: dd/mm/aaaa

        # Definir as margens da página
        margem_total = 10

        # Criar o PDF com os dados da empresa e as margens definidas
        buffer = BytesIO()
        doc = SimpleDocTemplate(buffer, pagesize=letter, leftMargin=margem_total, rightMargin=margem_total,
                                topMargin=margem_total, bottomMargin=margem_total)

        elements = []

        # Adicionar um espaçador para criar a margem superior
        elements.append(Spacer(1, margem_total))

        # Criando a tabela de dados da empresa
        # Obtém os estilos de amostra
        styles = getSampleStyleSheet()

        # Modifica o estilo padrão para negrito
        styles["Normal"].fontName = "Helvetica"
        lightgray = colors.Color(0.9, 0.9, 0.9)

        # Adicionar a imagem
        imagem_path = staticfiles_storage.path(
            'assets/img/logo-ama-footer.png')
        imagem = Image(imagem_path)
        imagem.drawHeight = 100  # Defina a altura da imagem
        imagem.drawWidth = 100  # Defina a largura da imagem
        # elements.append(imagem)

        data = [
            ['TERMO DE CONFORMIDADE DE MUDA FLORESTAL'],
            # A imagem agora estará na primeira célula, e queremos que ela ocupe também a segunda célula
            [imagem, '', Paragraph("<b>N° TERMO/ NF/ANO:</b>", styles['Normal'])],
        ]

        style = TableStyle([
            # Estilos previamente definidos
            ('FONTNAME', (0, 0), (-1, -1), 'Helvetica-Bold'),
            ('GRID', (0, 0), (-1, -1), 0.5, colors.grey),
            ('ALIGN', (0, 0), (-1, -1), 'CENTER'),
            ('BACKGROUND', (0, 0), (-1, 0), lightgray),
            # Aqui definimos o SPAN para a imagem ocupar as duas primeiras colunas
            ('SPAN', (0, 0), (-1, 0)),
            ('SPAN', (0, 1), (1, 1)),
            ('VALIGN', (0, 0), (-1, -1), 'MIDDLE'),
        ])


        # Adicionando a tabela ao documento
        tabela = Table(data, style=style)
        elements.append(tabela)

        separators = [
            ['']
        ]
        # Estilos da tabela
        separatorsstyle = TableStyle([
        ])

        # Criar a tabela
        sep = Table(separators, style=separatorsstyle)
        elements.append(sep)

        cadastro_saida = saidas_especies[0].cadastrosaida if saidas_especies else None
        if cadastro_saida:
            data2 = [
                    [Paragraph("<b>PRODUTOR:</b>", styles["Normal"]),'',Paragraph("" + cadastro_saida.produtor, styles["Normal"]),'','','RENASEM N°:',
                    Paragraph("" + cadastro_saida.renasem_produtor, styles["Normal"])],  # Texto "DESTINO MUDAS" na primeira célula
                ]
        else:
            data1 = []  # Ou algum outro valor padrão que faça sentido no seu contexto
        # Estilos da tabela
        style2 = TableStyle([
            # Adiciona uma grade à tabela
            ('GRID', (0, 0), (-1, -1), 0.5, colors.grey),
            # Combina a célula ['', ''] para ocupar quatro colunas
            ('SPAN', (0, 0), (1, 0)),
            # Define o fundo da coluna "DESTINO MUDAS" como lightgray
            ('SPAN', (2, 0), (4, 0)),
            # Define o fundo da coluna "DESTINO MUDAS" como lightgray
            ('BACKGROUND', (0, 0), (0, 0), lightgray),
            # Centraliza verticalmente todo o conteúdo da tabela
            ('VALIGN', (0, 0), (-1, -1), 'MIDDLE'),
        ])

        # Criar a segunda tabela
        table2 = Table(data2, style=style2)
        elements.append(table2)
        

        data3 = [
                [Paragraph("<b>RESPONSÁVEL TÉCNICO:</b>", styles["Normal"]),'',Paragraph("" + cadastro_saida.responsavel_tecnico, styles["Normal"]),'','','RENASEM N°:',
                 Paragraph("" + cadastro_saida.renasem_tecnico, styles["Normal"])],  # Texto "DESTINO MUDAS" na primeira célula
            ]
        # else:

        # Estilos da tabela
        style3 = TableStyle([
            # Adiciona uma grade à tabela
            ('GRID', (0, 0), (-1, -1), 0.5, colors.grey),
            # Combina a célula ['', ''] para ocupar quatro colunas
            ('SPAN', (0, 0), (1, 0)),
            # Define o fundo da coluna "DESTINO MUDAS" como lightgray
            ('SPAN', (2, 0), (4, 0)),
            # Define o fundo da coluna "DESTINO MUDAS" como lightgray
            ('BACKGROUND', (0, 0), (0, 0), lightgray),
            # Centraliza verticalmente todo o conteúdo da tabela
            ('VALIGN', (0, 0), (-1, -1), 'MIDDLE'),
        ])

        # Criar a segunda tabela
        table3 = Table(data3, style=style3)
        elements.append(table3)

        separators = [
            ['']
        ]
        # Estilos da tabela
        separatorsstyle = TableStyle([
        ])

        # Criar a tabela
        sep = Table(separators, style=separatorsstyle)
        elements.append(sep)

        data4 = [
            ["<b>N°</b>", "<b>Nome cientifico:</b>", "<b>Nome vulgar:</b>","<b>Categoria:</b>", "<b>N° lote:</b>",
             "<b>Quant. p/ espécie:</b>"]
        ]

        # Inicialize uma variável para armazenar a soma total
        soma_total = 0
        soma_total_qtd_especie = 0

        # Adiciona a sequência de números na coluna "N"
        for index, saida in enumerate(saidas_especies, start=1):
            row_data = [
                f"<b>{index}</b>",
                f"{saida.nome_cientifico}",
                f"{saida.nome_popular}",
                f"{saida.categoria}",
                f"{saida.numero_lote}",
                f"{saida.qtd_especie}",
            ]
            data4.append(row_data)

            # Adiciona o valor total à soma total após converter para float
            valor_total = saida.valor_total.replace(
                ',', '.')  # Substitui a vírgula por ponto
            soma_total += float(valor_total)

            # Adiciona a quantidade de espécies à soma total após converter para inteiro
            if saida.qtd_especie is not None and saida.qtd_especie != Decimal('0'):
                soma_total_qtd_especie += int(saida.qtd_especie)

            # Defina o estilo da célula
            cell_style = ParagraphStyle(
                'MyCellTextStyle',
                alignment=1,  # 0 = esquerda, 1 = centro, 2 = direita
            )


        # Estilos da tabela
        # Estilos da tabela
        style4 = TableStyle([
            ('GRID', (0, 0), (-1, -1), 0.5, colors.grey),
            ('BACKGROUND', (0, 0), (-1, 0), lightgray),
            ('BACKGROUND', (0, 1), (-1, -2), colors.white),
            ('VALIGN', (0, 0), (-1, -1), 'MIDDLE'),
            ('ALIGN', (0, 0), (-1, -1), 'CENTER'),
        ])

        # Defina a largura das colunas Nome Popular e Nome Científico
        # Defina a largura das colunas conforme necessário
        col_widths = [30, 160, 160, 80, 85, 65]
        # Defina a altura das linhas conforme necessário
        # Aqui você pode definir a altura desejada para cada linha
        row_heights = [35] * len(data4)

        # Convertendo os dados em elementos para a tabela
        table_data = []
        for row in data4:
            formatted_row = []
            for cell in row:
                # Verifica se a célula é uma string não vazia
                if isinstance(cell, str) and cell.strip():
                    formatted_row.append(Paragraph(cell, cell_style))
                else:
                    formatted_row.append(cell)
            table_data.append(formatted_row)

        # Criando a tabela com a largura e altura das colunas definidas
        table4 = Table(table_data, colWidths=col_widths,
                       rowHeights=row_heights, style=style4)
        elements.append(table4)

        # Defina a observação acima das assinaturas
        # Defina a observação acima das assinaturas
        observacao = "Atesto que as mudas das espécies florestais foram produzidas de acordo com as normas e padrões estabelecidos pelo Ministério da Agricultura, Pecuária e Abastecimento, pelos quais assumo a responsabilidade pela identidade e qualidade."

        # Estilo de parágrafo para a observação
        paragrafo_observacao_style = ParagraphStyle(
            name='Observacao',
            spaceBefore=50,  # Espaçamento superior de 10 pontos
        )

        # Parágrafo para a observação
        paragrafo_observacao = Paragraph(
            observacao, paragrafo_observacao_style)
        # Wrap para calcular a largura e altura do parágrafo
        paragrafo_observacao.wrapOn(doc, 500, 100)
        paragrafo_observacao._leading = 20  # Aumenta o espaço entre as linhas

        altura_linha_cliente = 70
        altura_linha_cliente2 = 50


        # Estilo de parágrafo para centralizar o texto na célula da tabela
        cell_style = ParagraphStyle(
            name='TableCell',
            alignment=1,  # 0 = Esquerda, 1 = Centro, 2 = Direita
            fontSize=10,
        )

         # Linha para assinatura do CLIENTE
        linha_assinatura_cliente_localdata = Table(
            [
                [Paragraph(
                    "Local e data:_____________________________________________________________", styles["Normal"])],
                # Linha com o texto "ASSINATURA CLIENTE"
                [Paragraph("", cell_style)],
            ],
            colWidths=[500],
            # Altura da linha de assinatura e da linha "ASSINATURA CLIENTE"
            rowHeights=[altura_linha_cliente2, 5],
            hAlign='LEFT',  # Centralizar horizontalmente a linha
            vAlign=''  # Centralizar verticalmente a linha
        )
        linha_assinatura_cliente_tecnicoass = Table(
            [
                [Paragraph(
                    "Assinatura responsável Técnico:______________________________________________", styles["Normal"])],
                # Linha com o texto "ASSINATURA CLIENTE"
                [Paragraph("", cell_style)],
            ],
            colWidths=[500],
            # Altura da linha de assinatura e da linha "ASSINATURA CLIENTE"
            rowHeights=[altura_linha_cliente2, 5],
            hAlign='LEFT',  # Centralizar horizontalmente a linha
            vAlign=''  # Centralizar verticalmente a linha
        )

        # Linha para assinatura do CLIENTE
        linha_assinatura_cliente = Table(
            [
                [Paragraph(
                    "x___________________________________________________________", styles["Normal"])],
                # Linha com o texto "ASSINATURA CLIENTE"
                [Paragraph("Assinatura recebimento cliente", cell_style)],
            ],
            colWidths=[350],
            # Altura da linha de assinatura e da linha "ASSINATURA CLIENTE"
            rowHeights=[altura_linha_cliente, 20],
            hAlign='CENTER',  # Centralizar horizontalmente a linha
            vAlign='MIDDLE'  # Centralizar verticalmente a linha
        )

        # Adicione a observação acima das linhas de assinatura
        elements.append(paragrafo_observacao)

        elements.append(linha_assinatura_cliente_localdata)
        elements.append(linha_assinatura_cliente_tecnicoass)
        elements.append(linha_assinatura_cliente)

        # Adicione a lista de elementos ao documento
        doc.build(elements)

        # Retornar o PDF como uma resposta HTTP
        pdf = buffer.getvalue()
        buffer.close()
        response.write(pdf)
        return response

    else:
        # Se a solicitação não for POST, retorne um HttpResponse vazio
        return HttpResponse()