from django.shortcuts import render, redirect, get_object_or_404
from apps.dashboard.utils import get_user_info
from apps.especies.forms import EspeciesForms
from django.contrib import messages
from apps.especies.models import Especies
from apps.outras_informacoes.models import PlantioOutrasInformacoesModels
from apps.producao.models import ProducaoMudas
from django.core.exceptions import ObjectDoesNotExist
from apps.lotes.models import CadastroLote, Semeadura
from apps.repique.models import Repique
from apps.estufa.models import Estufa, Selecao
from apps.protocolos.models import ProtocoloSemeadura

# PDF
from reportlab.lib.pagesizes import letter
from reportlab.lib import colors
from reportlab.platypus import SimpleDocTemplate, Paragraph, Spacer, Table, TableStyle, Image, PageBreak
from reportlab.lib.styles import getSampleStyleSheet
from reportlab.lib.units import inch
from io import BytesIO
from django.http import HttpResponse
from django.conf import settings
import os
from django.utils.safestring import mark_safe


def cadastro_especies(request):
    if not request.user.is_authenticated:
        return redirect('index')
    user_info = get_user_info(request.user.id)
    return render(request, 'especies/cadastro_especies.html', {"user_info": user_info})


def cadastro_de_especies(request):
    form = EspeciesForms()  # Instancie o formulário com parênteses

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

    user_info = get_user_info(request.user.id)

    if request.method == 'POST':
        form = EspeciesForms(request.POST, request.FILES)
        if form.is_valid():
            # Obtenha o nome da espécie do formulário
            especies = form.cleaned_data['especies']
            # Verifique se a espécie com o mesmo nome já existe
            if Especies.objects.filter(especies=especies).exists():
                # Mensagem de erro
                messages.error(request, mark_safe(
                    '<i class="fa-solid fa-circle-exclamation"></i><strong class="mx-1">Erro!</strong> Espécie ja existe.'))
            else:
                form.save()
                messages.success(request, mark_safe(
                    '<i class="fa-solid fa-circle-check"></i><strong class="mx-1">Sucesso!</strong>  Espécie cadastrada com êxito.'))
                return redirect('lista_especies')

    return render(request, 'especies/cadastro_de_especies.html', {"form": form, "user_info": user_info})


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

    user_info = get_user_info(request.user.id)
    especies = Especies.objects.all()

    # Adicione o caminho base para as imagens

    base_url = settings.MEDIA_URL
    for especie in especies:
        if especie.foto_especie:
            especie.foto_especie = f"{base_url}{especie.foto_especie}"
        else:
            # Define manualmente o caminho para a imagem padrão usando STATIC_URL
            especie.foto_especie = f"{settings.STATIC_URL}assets/img/foto_planta.gif"
            # Adicione a informação sobre a existência de uma produção de mudas para cada espécie
            
        especie.producao_existente = ProducaoMudas.objects.filter(
            especie=especie).exists()

        especie.informacao_existente = PlantioOutrasInformacoesModels.objects.filter(
            especie=especie).exists()

        # Adicione a informação sobre a existência de uma imagem para cada espécie
        especie.imagem_existente = bool(especie.foto_especie)

    return render(request, 'especies/lista_especies.html', {"cards": especies, "user_info": user_info})


def editar_especie(request, especie_id):
    especie = get_object_or_404(Especies, pk=especie_id)

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

    user_info = get_user_info(request.user.id)

    if request.method == 'POST':
        form = EspeciesForms(request.POST, request.FILES, instance=especie)
        if form.is_valid():
            if 'foto_especie' in request.FILES:
                especie.foto_especie = request.FILES['foto_especie']
            form.save()

            # Adicione a mensagem de sucesso aqui
            messages.success(request, mark_safe(
                '<i class="fa-solid fa-circle-check"></i><strong class="mx-1">Sucesso!</strong>  Espécie atualizada com êxito.'))

            return redirect('lista_especies')
    else:
        form = EspeciesForms(instance=especie)

    return render(request, 'especies/editar_especie.html', {"form": form, "user_info": user_info, 'especie': especie, "especie_id": especie_id})


def deletar_especies(request, especie_id):
    try:
        especies = Especies.objects.get(id=especie_id)
        especies.delete()
        messages.success(request, mark_safe(
            '<i class="fa-solid fa-circle-check"></i><strong class="mx-1">Sucesso!</strong> Espécie excluida com êxito.'))
        return redirect('lista_especies')
    except ObjectDoesNotExist:
        messages.error(request, mark_safe(
            '<i class="fa-solid fa-circle-exclamation"></i><strong class="mx-1">Erro!</strong> Ocorreu um problema ao tentar excluir a Espécie.'))
        return redirect('lista_especies')


def generate_pdf(request):
    # Dados de exemplo (substitua pelos seus dados reais)
    dados = Especies.objects.all()

    response = HttpResponse(content_type='application/pdf')
    response['Content-Disposition'] = 'attachment; filename=lista_especies.pdf'

    buffer = BytesIO()

    # Crie um objeto PDF usando ReportLab
    doc = SimpleDocTemplate(buffer, pagesize=letter)
    elements = []

    # Adicione a sua logo
    logo_path = os.path.join(settings.STATIC_ROOT,
                             'assets/img/logo-footer.jpg')
    logo = Image(logo_path, width=2.5*inch, height=2*inch)

    # Crie um conteúdo para a logo
    logo_content = []
    logo_content.append(logo)

    # Crie um conteúdo para as informações da empresa
    empresa_info = """
    Telefone: (73) 2011-0214
    Email: ama@viveiroama.com.br
    Endereço: Rod Br 101 KM 888 s/n Zona Rural (ao lado da parada do pedrao), Teixeira de Freitas, BA, Brazil
    """
    empresa_info_paragraph = Paragraph(
        empresa_info, getSampleStyleSheet()['Normal'])
    empresa_info_content = []
    empresa_info_content.append(empresa_info_paragraph)

    # Crie uma tabela para organizar a logo e as informações da empresa
    table_data = [
        [logo_content, empresa_info_content]
    ]
    table = Table(table_data, colWidths=[2*inch, 4*inch])

    # Estilize a tabela
    table.setStyle(TableStyle([
        ('ALIGN', (0, 0), (-1, -1), 'CENTER'),
        ('VALIGN', (0, 0), (-1, -1), 'CENTER')
    ]))

    elements.append(table)

    # Espaço em branco entre a logo/informações da empresa e a tabela de dados
    elements.append(Spacer(1, 0.25*inch))

    # Crie a tabela com os dados das espécies
    data = []
    data.append(['Nome', 'Nome Popular', 'Familia', 'Risco Extincao'])

    for especie in dados:
        data.append([especie.especies, especie.nome_popular,
                    especie.familia, especie.risco_extincao])

    hex_color = '#198754'  # Por exemplo, vermelho
    table = Table(data)
    style = TableStyle([
        ('BACKGROUND', (0, 0), (-1, 0), hex_color),
        ('TEXTCOLOR', (0, 0), (-1, 0), colors.whitesmoke),
        ('ALIGN', (0, 0), (-3, -1), 'LEFT'),
        ('FONTNAME', (0, 0), (-1, 0), 'Helvetica-Bold'),
        ('BOTTOMPADDING', (0, 0), (-1, 0), 12),
        ('BACKGROUND', (0, 1), (-1, -1), colors.whitesmoke),
        ('GRID', (0, 0), (-1, -1), 1, colors.black),
    ])
    table.setStyle(style)
    elements.append(table)

    # Adicione um rodapé com informações adicionais
    rodape_info = "Informações adicionais no rodapé, se necessário."
    rodape_info_paragraph = Paragraph(
        rodape_info, getSampleStyleSheet()['Normal'])
    elements.append(Spacer(1, 0.25*inch))
    elements.append(rodape_info_paragraph)

    doc.build(elements)

    # Mova o ponteiro do buffer para o início e escreva a resposta
    buffer.seek(0)
    response.write(buffer.read())
    buffer.close()

    return response


from collections import defaultdict
import random

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

    user_info = get_user_info(request.user.id)
    especies = Especies.objects.all()
    especie_selecionada = None
    total_lotes = 0
    total_mudas_vendidas = 0
    total_valor_monetario = 0
    total_qtd_utilizada = 0
    total_qtd_repicada = 0
    total_qtd_selecao = 0
    total_qtd_mortalidade = 0
    vendas_por_data = []
    semeaduras_por_especie = []
    repiques_por_especie = []
    estufas_por_especie = []
    selecoes_por_especie = []

    if request.method == 'GET':
        especie_selecionada_id = request.GET.get('especie_selecionada')

        if not especie_selecionada_id and especies.exists():
            especie_selecionada = random.choice(especies)
        elif especie_selecionada_id:
            especie_selecionada = Especies.objects.filter(id=especie_selecionada_id).first()

        if especie_selecionada:
            # Processar os campos de texto
            especie_selecionada.bioma = especie_selecionada.bioma.replace('[', '').replace(']', '').replace("'", '').strip()
            especie_selecionada.formacao_vegetal = especie_selecionada.formacao_vegetal.replace('[', '').replace(']', '').replace("'", '').strip()
            especie_selecionada.fitofisionomias = especie_selecionada.fitofisionomias.replace('[', '').replace(']', '').replace("'", '').strip()
            especie_selecionada.presenca_estados = especie_selecionada.presenca_estados.replace('[', '').replace(']', '').replace("'", '').strip()

            # Contar os lotes registrados para a espécie selecionada
            total_lotes = CadastroLote.objects.filter(especie_id=especie_selecionada.id).count()

            # Buscar os protocolos relacionados à espécie
            protocolos_semeaduras = ProtocoloSemeadura.objects.filter(
                semeadura__lote__especie_id=especie_selecionada.id
            ).select_related('protocolo', 'semeadura')

            dados_agrupados = defaultdict(lambda: {'quantidade': 0, 'valor_monetario': 0})
            for ps in protocolos_semeaduras:
                data_criacao = ps.protocolo.data_criacao
                dados_agrupados[data_criacao]['quantidade'] += ps.qtd_especie or 0
                dados_agrupados[data_criacao]['valor_monetario'] += (ps.qtd_especie or 0) * (ps.valor_unit or 0)

            vendas_por_data = [
                {'data': data, 'quantidade': valores['quantidade'], 'valor_monetario': valores['valor_monetario']}
                for data, valores in dados_agrupados.items()
            ]

            total_mudas_vendidas = sum(item['quantidade'] for item in vendas_por_data)
            total_valor_monetario = sum(item['valor_monetario'] for item in vendas_por_data)

            # Buscar as semeaduras relacionadas à espécie selecionada
            semeaduras_por_especie = Semeadura.objects.filter(
                lote__especie_id=especie_selecionada.id
            ).values(
                'lote__numero_lote',
                'numero_muda',
                'data_semeia',
                'metodo_semeadura',
                'local_semeadura',
                'abertura',
                'qtd_sementes_utilizada',
                'registrado_por__username'
            )
            total_qtd_utilizada = sum(s['qtd_sementes_utilizada'] for s in semeaduras_por_especie)

            # Buscar os repiques relacionados à espécie selecionada
            repiques_por_especie = Repique.objects.filter(
                semeadura__lote__especie_id=especie_selecionada.id
            ).values(
                'semeadura__numero_muda',
                'semeadura__lote__numero_lote',
                'data_repique',
                'quantidade_repicada',
                'registrado_por__username'
            )
            total_qtd_repicada = sum(r['quantidade_repicada'] for r in repiques_por_especie)

            # Buscar as estufas relacionadas à espécie selecionada
            estufas_por_especie = Estufa.objects.filter(
                semeadura__lote__especie_id=especie_selecionada.id
            ).values(
                'semeadura__lote__numero_lote',
                'data_estufa',
                'quantidade_mortalidade',
                'registrado_por__username'
            )
            total_qtd_mortalidade = sum(e['quantidade_mortalidade'] for e in estufas_por_especie)

            # Buscar as seleções relacionadas à espécie selecionada
            selecoes_por_especie = Selecao.objects.filter(
                semeadura__lote__especie_id=especie_selecionada.id
            ).values(
                'semeadura__lote__numero_lote',
                'data_selecao',
                'quantidade_selecao',
                'registrado_por__username'
            )
            total_qtd_selecao = sum(s['quantidade_selecao'] for s in selecoes_por_especie)

    return render(request, 'especies/relatorio_especies.html', {
        'especies': especies,
        'user_info': user_info,
        'especie_selecionada': especie_selecionada,
        'total_lotes': total_lotes,
        'total_mudas_vendidas': total_mudas_vendidas,
        'total_valor_monetario': total_valor_monetario,
        'total_qtd_utilizada': total_qtd_utilizada,
        'total_qtd_repicada': total_qtd_repicada,
        'total_qtd_mortalidade': total_qtd_mortalidade,
        'total_qtd_selecao': total_qtd_selecao,
        'vendas_por_data': vendas_por_data or [{'data': None, 'quantidade': 0, 'valor_monetario': 0}],
        'semeaduras_por_especie': semeaduras_por_especie,
        'repiques_por_especie': repiques_por_especie,
        'estufas_por_especie': estufas_por_especie,
        'selecoes_por_especie': selecoes_por_especie,
    })
