# -*- coding: utf-8 -*-
"""
relatorio_pdf.py — Gera PDFs timbrados com logo configurável
"""
import io
from datetime import datetime
from reportlab.lib import colors
from reportlab.lib.pagesizes import A4
from reportlab.lib.styles import getSampleStyleSheet, ParagraphStyle
from reportlab.lib.units import cm
from reportlab.platypus import SimpleDocTemplate, Table, TableStyle, Paragraph, Spacer, HRFlowable
from reportlab.lib.enums import TA_CENTER, TA_LEFT

NAVY  = colors.HexColor("#1C1E3B")
BLUE  = colors.HexColor("#1CA6FC")
GRAY  = colors.HexColor("#ECECEC")
RED   = colors.HexColor("#DC2626")
GREEN = colors.HexColor("#16A34A")
AMBER = colors.HexColor("#F59E0B")
WHITE = colors.white
DARK  = colors.HexColor("#2D2D2D")

def _doc_base(buffer, titulo, subtitulo, nome_empresa, nome_arquivo):
    doc = SimpleDocTemplate(buffer, pagesize=A4,
        leftMargin=2*cm, rightMargin=2*cm,
        topMargin=2*cm, bottomMargin=2*cm)
    story = []
    s_tit = ParagraphStyle("t", fontName="Helvetica-Bold", fontSize=18,
        textColor=NAVY, alignment=TA_CENTER, spaceAfter=4)
    s_sub = ParagraphStyle("s", fontName="Helvetica", fontSize=11,
        textColor=BLUE, alignment=TA_CENTER, spaceAfter=2)
    s_meta = ParagraphStyle("m", fontName="Helvetica", fontSize=9,
        textColor=DARK, alignment=TA_CENTER, spaceAfter=12)
    s_footer = ParagraphStyle("f", fontName="Helvetica", fontSize=8,
        textColor=colors.HexColor("#808080"), alignment=TA_CENTER, spaceBefore=4)

    story.append(Paragraph(nome_empresa, s_tit))
    story.append(Paragraph(titulo, s_sub))
    story.append(Paragraph(
        f"Arquivo: {nome_arquivo} &nbsp;|&nbsp; Gerado: {datetime.now().strftime('%d/%m/%Y %H:%M')}",
        s_meta))
    story.append(HRFlowable(width="100%", thickness=2, color=NAVY))
    story.append(Spacer(1, 0.4*cm))
    return doc, story, s_footer

def _tabela_padrao(dados, col_widths=None):
    n = len(dados[0]) if dados else 1
    cw = col_widths or [17*cm/n]*n
    t = Table(dados, colWidths=cw, repeatRows=1)
    t.setStyle(TableStyle([
        ("BACKGROUND",    (0,0), (-1,0), NAVY),
        ("TEXTCOLOR",     (0,0), (-1,0), WHITE),
        ("FONTNAME",      (0,0), (-1,0), "Helvetica-Bold"),
        ("FONTSIZE",      (0,0), (-1,-1), 8),
        ("ALIGN",         (0,0), (-1,-1), "CENTER"),
        ("VALIGN",        (0,0), (-1,-1), "MIDDLE"),
        ("ROWBACKGROUNDS",(0,1), (-1,-1), [WHITE, GRAY]),
        ("GRID",          (0,0), (-1,-1), 0.3, colors.HexColor("#CCCCCC")),
        ("TOPPADDING",    (0,0), (-1,-1), 4),
        ("BOTTOMPADDING", (0,0), (-1,-1), 4),
    ]))
    return t

def _rodape(story, s_footer, nome_empresa):
    story.append(Spacer(1, 0.8*cm))
    story.append(HRFlowable(width="100%", thickness=1, color=NAVY))
    story.append(Paragraph(
        f"Desenvolvido por RevolutionIT Soluções em TI &nbsp;|&nbsp; revolutionit.com.br",
        s_footer))

def _cards_resumo(stats):
    dados = [[
        "Total bruto","Sem motorista","Abaixo limite","Válidos inseridos"
    ],[
        str(stats.get("total_bruto",0)),
        str(stats.get("sem_motorista",0)),
        str(stats.get("abaixo_limite",0)),
        str(stats.get("validos",0)),
    ]]
    t = Table(dados, colWidths=[4.25*cm]*4)
    t.setStyle(TableStyle([
        ("BACKGROUND",    (0,0), (-1,0), NAVY),
        ("TEXTCOLOR",     (0,0), (-1,0), WHITE),
        ("FONTNAME",      (0,0), (-1,0), "Helvetica-Bold"),
        ("FONTSIZE",      (0,0), (-1,0), 9),
        ("ALIGN",         (0,0), (-1,-1), "CENTER"),
        ("VALIGN",        (0,0), (-1,-1), "MIDDLE"),
        ("FONTNAME",      (0,1), (-1,1), "Helvetica-Bold"),
        ("FONTSIZE",      (0,1), (-1,1), 20),
        ("TEXTCOLOR",     (0,1), (0,1), DARK),
        ("TEXTCOLOR",     (1,1), (1,1), RED),
        ("TEXTCOLOR",     (2,1), (2,1), AMBER),
        ("TEXTCOLOR",     (3,1), (3,1), GREEN),
        ("BACKGROUND",    (0,1), (-1,1), GRAY),
        ("GRID",          (0,0), (-1,-1), 0.5, colors.HexColor("#CCCCCC")),
        ("TOPPADDING",    (0,0), (-1,-1), 8),
        ("BOTTOMPADDING", (0,0), (-1,-1), 8),
    ]))
    return t

# ── PDF de descartados ────────────────────────────────────────
def gerar_pdf_descartados(df_desc, stats: dict, nome_arquivo: str, nome_empresa: str = "RevolutionIT") -> bytes:
    buffer = io.BytesIO()
    doc, story, s_footer = _doc_base(buffer,
        "Relatório de Eventos sem Motorista Identificado",
        "Eventos descartados — revisar configuração dos veículos",
        nome_empresa, nome_arquivo)

    s_alert = ParagraphStyle("al", fontName="Helvetica-Bold", fontSize=10,
        textColor=RED, spaceAfter=10)
    story.append(Paragraph(
        f"⚠  {stats.get('sem_motorista',0)} evento(s) descartados por falta de motorista identificado "
        f"no MiX Telematics. NÃO foram contabilizados no dashboard.", s_alert))

    story.append(_cards_resumo(stats))
    story.append(Spacer(1, 0.5*cm))

    s_sec = ParagraphStyle("sec", fontName="Helvetica-Bold", fontSize=11,
        textColor=NAVY, spaceAfter=6)
    story.append(Paragraph("Detalhamento dos Eventos Descartados", s_sec))

    if df_desc is not None and len(df_desc) > 0:
        cols = list(df_desc.columns)
        dados = [cols] + df_desc.fillna("-").values.tolist()
        story.append(_tabela_padrao(dados))
    else:
        story.append(Paragraph("Nenhum evento descartado nesta importação.",
            getSampleStyleSheet()["Normal"]))

    _rodape(story, s_footer, nome_empresa)
    doc.build(story)
    buffer.seek(0)
    return buffer.read()

# ── PDF de auditoria mensal ────────────────────────────────────
def gerar_pdf_auditoria_mensal(resultado_auditoria: dict, nome_arquivo: str, nome_empresa: str = "RevolutionIT") -> bytes:
    buffer = io.BytesIO()
    resumo = resultado_auditoria.get("resumo", {})
    doc, story, s_footer = _doc_base(buffer,
        "Relatório de Auditoria Mensal",
        f"Período: {resumo.get('periodo_inicio','')} a {resumo.get('periodo_fim','')}",
        nome_empresa, nome_arquivo)

    s_sec = ParagraphStyle("sec", fontName="Helvetica-Bold", fontSize=11,
        textColor=NAVY, spaceAfter=6)

    # Cards de resumo da auditoria
    dados_res = [[
        "Dias OK","Dias com Divergência","Eventos Novos Encontrados"
    ],[
        str(resumo.get("ok", 0)),
        str(resumo.get("divergentes", 0)),
        str(resumo.get("novos", 0)),
    ]]
    t_res = Table(dados_res, colWidths=[5.67*cm]*3)
    t_res.setStyle(TableStyle([
        ("BACKGROUND",    (0,0), (-1,0), NAVY),
        ("TEXTCOLOR",     (0,0), (-1,0), WHITE),
        ("FONTNAME",      (0,0), (-1,0), "Helvetica-Bold"),
        ("FONTSIZE",      (0,0), (-1,0), 9),
        ("ALIGN",         (0,0), (-1,-1), "CENTER"),
        ("VALIGN",        (0,0), (-1,-1), "MIDDLE"),
        ("FONTNAME",      (0,1), (-1,1), "Helvetica-Bold"),
        ("FONTSIZE",      (0,1), (-1,1), 24),
        ("TEXTCOLOR",     (0,1), (0,1), GREEN),
        ("TEXTCOLOR",     (1,1), (1,1), RED),
        ("TEXTCOLOR",     (2,1), (2,1), AMBER),
        ("BACKGROUND",    (0,1), (-1,1), GRAY),
        ("GRID",          (0,0), (-1,-1), 0.5, colors.HexColor("#CCCCCC")),
        ("TOPPADDING",    (0,0), (-1,-1), 10),
        ("BOTTOMPADDING", (0,0), (-1,-1), 10),
    ]))
    story.append(t_res)
    story.append(Spacer(1, 0.5*cm))

    # Dias com divergência
    divs = resultado_auditoria.get("dias_divergentes", [])
    if divs:
        story.append(Paragraph("⚠ Dias com Divergência", s_sec))
        dados_div = [["Data","No Banco","No Mensal","Diferença"]]
        for d in divs:
            cor_dif = f"+{d['diferenca']}" if d['diferenca'] > 0 else str(d['diferenca'])
            dados_div.append([d["data"], str(d["banco"]), str(d["mensal"]), cor_dif])
        story.append(_tabela_padrao(dados_div, [4*cm,3.5*cm,3.5*cm,3.5*cm]))
        story.append(Spacer(1, 0.4*cm))

    # Dias OK
    dias_ok = resultado_auditoria.get("dias_ok", [])
    if dias_ok:
        story.append(Paragraph("✅ Dias Conferidos e OK", s_sec))
        dados_ok = [["Data","Quantidade de Eventos"]]
        for d in dias_ok:
            dados_ok.append([d["data"], str(d["quantidade"])])
        story.append(_tabela_padrao(dados_ok, [8.5*cm, 8.5*cm]))

    _rodape(story, s_footer, nome_empresa)
    doc.build(story)
    buffer.seek(0)
    return buffer.read()
