import json
from reportlab.lib import colors
from reportlab.lib.pagesizes import A4
from reportlab.platypus import SimpleDocTemplate, Paragraph, Spacer, Table, TableStyle, PageBreak, HRFlowable
from reportlab.lib.styles import getSampleStyleSheet, ParagraphStyle
from reportlab.lib.units import cm

def gerar_pdf_similares(json_path, pdf_path):
    with open(json_path, 'r', encoding='utf-8') as f:
        dados_gerais = json.load(f)
        
    doc = SimpleDocTemplate(
        pdf_path,
        pagesize=A4,
        leftMargin=1.5*cm,
        rightMargin=1.5*cm,
        topMargin=1.5*cm,
        bottomMargin=1.5*cm
    )
    
    styles = getSampleStyleSheet()
    
    azul_brana = colors.HexColor('#002B49')
    cinza_fundo = colors.HexColor('#F4F6F8')
    cinza_borda = colors.HexColor('#D1D5DB')
    texto_escuro = colors.HexColor('#1F2937')
    
    title_style = ParagraphStyle(
        'DocTitle',
        parent=styles['Heading1'],
        fontName='Helvetica-Bold',
        fontSize=20,
        leading=24,
        textColor=azul_brana,
        spaceAfter=4
    )
    
    sub_style = ParagraphStyle(
        'DocSub',
        parent=styles['Normal'],
        fontName='Helvetica',
        fontSize=10,
        leading=14,
        textColor=colors.HexColor('#4B5563')
    )
    
    h2_style = ParagraphStyle(
        'DocH2',
        parent=styles['Heading2'],
        fontName='Helvetica-Bold',
        fontSize=13,
        leading=16,
        textColor=azul_brana,
        spaceBefore=12,
        spaceAfter=6
    )
    
    body_style = ParagraphStyle(
        'DocBody',
        parent=styles['Normal'],
        fontName='Helvetica',
        fontSize=9,
        leading=13,
        textColor=texto_escuro
    )
    
    table_hdr = ParagraphStyle(
        'TableHdr',
        parent=styles['Normal'],
        fontName='Helvetica-Bold',
        fontSize=7.5,
        leading=9,
        textColor=colors.white,
        alignment=1
    )
    
    table_cell = ParagraphStyle(
        'TableCell',
        parent=styles['Normal'],
        fontName='Helvetica',
        fontSize=7.5,
        leading=9,
        textColor=texto_escuro,
        alignment=1
    )
    
    table_cell_bold = ParagraphStyle(
        'TableCellBold',
        parent=styles['Normal'],
        fontName='Helvetica-Bold',
        fontSize=7.5,
        leading=9,
        textColor=azul_brana,
        alignment=1
    )

    table_param = ParagraphStyle(
        'TableParam',
        parent=styles['Normal'],
        fontName='Helvetica-Bold',
        fontSize=7.5,
        leading=9,
        textColor=azul_brana
    )

    story = []
    
    # Cabeçalho
    story.append(Paragraph("ESTUDO DE SIMILARES — RELATÓRIO TÉCNICO", title_style))
    story.append(Paragraph(f"<b>Projetista:</b> {dados_gerais.get('projetista', 'Carlos Silva')} | <b>Data:</b> {dados_gerais.get('data', '15/09/2026')}", sub_style))
    story.append(Paragraph(f"<b>Embarcação Pretendida:</b> {dados_gerais.get('embarcacao_pretendida', '')}", sub_style))
    story.append(Spacer(1, 0.3*cm))
    story.append(HRFlowable(width="100%", thickness=1.5, color=azul_brana, spaceBefore=2, spaceAfter=8))
    
    # Resumo do Caso de Uso
    story.append(Paragraph("1. Resumo do Caso de Uso e Critérios de Seleção", h2_style))
    story.append(Paragraph(dados_gerais.get('caso_de_uso_resumo', ''), body_style))
    story.append(Spacer(1, 0.2*cm))
    story.append(Paragraph(f"<b>Critérios de Seleção:</b> {dados_gerais.get('criterios_selecao', '')}", body_style))
    story.append(Spacer(1, 0.4*cm))
    
    # Tabela Comparativa Completa
    story.append(Paragraph("2. Tabela Comparativa de Embarcações (Sistema Métrico - SI)", h2_style))
    
    similares = dados_gerais.get('similares', [])
    
    # Cabeçalho da Tabela
    headers = [Paragraph("<b>Parâmetro</b>", table_hdr)]
    for s in similares[:6]:
        headers.append(Paragraph(f"<b>{s['nome']}<br/>({s['estaleiro']})</b>", table_hdr))
    headers.append(Paragraph("<b>BA-32<br/>(Projeto)</b>", table_hdr))
    
    t_data = [headers]
    
    # Linhas de parâmetros
    params = [
        ("LOA (m)", lambda d, s: f"{d.get('loa')*0.3048:.2f}" if s=='imperial' and d.get('loa') else (f"{d.get('loa'):.2f}" if d.get('loa') else "—"), "9,75"),
        ("LWL (m)", lambda d, s: f"{d.get('lwl')*0.3048:.2f}" if s=='imperial' and d.get('lwl') else (f"{d.get('lwl'):.2f}" if d.get('lwl') else "—"), "8,53"),
        ("BOA (m)", lambda d, s: f"{d.get('boa')*0.3048:.2f}" if s=='imperial' and d.get('boa') else (f"{d.get('boa'):.2f}" if d.get('boa') else "—"), "3,25"),
        ("Calado (m)", lambda d, s: f"{d.get('calado')*0.3048:.2f}" if s=='imperial' and d.get('calado') else (f"{d.get('calado'):.2f}" if d.get('calado') else "—"), "1,45"),
        ("Deslocamento (kg)", lambda d, s: f"{int(d.get('deslocamento')*0.453592)}" if s=='imperial' and d.get('deslocamento') else (f"{int(d.get('deslocamento'))}" if d.get('deslocamento') else "—"), "4.800"),
        ("Potência (HP)", lambda d, s: f"{d.get('potencia')}" if d.get('potencia') else "—", "25"),
        ("Combustível (L)", lambda d, s: f"{int(d.get('combustivel')*3.78541)}" if s=='imperial' and d.get('combustivel') else (f"{int(d.get('combustivel'))}" if d.get('combustivel') else "—"), "150"),
        ("Água Doce (L)", lambda d, s: f"{int(d.get('agua')*3.78541)}" if s=='imperial' and d.get('agua') else (f"{int(d.get('agua'))}" if d.get('agua') else "—"), "260"),
        ("LOA / BOA", lambda d, s: f"{(d.get('loa')/d.get('boa')):.2f}" if d.get('loa') and d.get('boa') else "—", "3,00"),
        ("DLR", lambda d, s: f"{( (d.get('deslocamento')/2240) / ((0.01*d.get('lwl'))**3) ):.1f}" if s=='imperial' and d.get('deslocamento') and d.get('lwl') else "—", "285,0"),
        ("Desloc. / Pot. (kg/HP)", lambda d, s: f"{( (d.get('deslocamento')*0.453592) / d.get('potencia') ):.1f}" if s=='imperial' and d.get('deslocamento') and d.get('potencia') else "—", "192,0")
    ]
    
    for nome_p, func_val, val_alvo in params:
        row = [Paragraph(nome_p, table_param)]
        for s in similares[:6]:
            v = func_val(s.get('dados', {}), s.get('sistema', 'imperial'))
            row.append(Paragraph(str(v), table_cell))
        row.append(Paragraph(val_alvo, table_cell_bold))
        t_data.append(row)
        
    col_widths = [3.2*cm] + [2.1*cm]*6 + [2.2*cm]
    t = Table(t_data, colWidths=col_widths)
    t.setStyle(TableStyle([
        ('BACKGROUND', (0,0), (-1,0), azul_brana),
        ('ALIGN', (0,0), (-1,-1), 'CENTER'),
        ('VALIGN', (0,0), (-1,-1), 'MIDDLE'),
        ('GRID', (0,0), (-1,-1), 0.5, cinza_borda),
        ('ROWBACKGROUNDS', (0,1), (-1,-1), [colors.white, cinza_fundo]),
        ('TOPPADDING', (0,0), (-1,-1), 4),
        ('BOTTOMPADDING', (0,0), (-1,-1), 4),
        ('BACKGROUND', (-1,1), (-1,-1), colors.HexColor('#EBF3F8')),
    ]))
    
    story.append(t)
    story.append(Spacer(1, 0.4*cm))
    
    # Leitura Paramétrica e Recomendações
    story.append(Paragraph("3. Leitura Paramétrica e Recomendações de Projeto", h2_style))
    story.append(Paragraph(f"<b>Análise Estatística:</b> {dados_gerais.get('leitura_parametrica', '')}", body_style))
    story.append(Spacer(1, 0.2*cm))
    story.append(Paragraph(f"<b>Diretrizes Adotadas para o BA-32:</b> {dados_gerais.get('recomendacao', '')}", body_style))
    story.append(Spacer(1, 0.4*cm))
    
    # Detalhes dos Similares & Fontes
    story.append(Paragraph("4. Fichas Técnicas das Embarcações Auditadas", h2_style))
    for s in similares[:6]:
        fonte_info = s.get('fontes', [{}])[0]
        txt = f"• <b>{s['nome']}</b> ({s.get('estaleiro','')}, {s.get('ano','')}) — {s.get('porque_similar','')}<br/>" \
              f"  <i>Fonte:</i> {fonte_info.get('nome','')} | <i>URL:</i> {fonte_info.get('url','')} (Acesso: {fonte_info.get('data_acesso','')})"
        story.append(Paragraph(txt, ParagraphStyle('FonteItem', parent=body_style, fontSize=8, leading=11, spaceAfter=4)))
        
    story.append(Spacer(1, 0.3*cm))
    story.append(HRFlowable(width="100%", thickness=0.8, color=cinza_borda, spaceBefore=4, spaceAfter=6))
    story.append(Paragraph("<i>Relatório gerado em conformidade com o padrão técnico da Brana Projetos Navais e Estaleiro Escola Embrião (EEE).</i>", ParagraphStyle('Rodape', parent=body_style, fontSize=7.5, textColor=colors.HexColor('#6B7280'), alignment=1)))
    
    doc.build(story)

if __name__ == '__main__':
    gerar_pdf_similares(
        '/home/magdalena/eee/alunos/carlos-silva/similares_dados.json',
        '/home/magdalena/eee/alunos/carlos-silva/Estudo_de_Similar_Carlos_Silva.pdf'
    )
