#!/usr/bin/env python3
import json
from pathlib import Path
from reportlab.lib.pagesizes import letter
from reportlab.lib import colors
from reportlab.platypus import SimpleDocTemplate, Paragraph, Spacer, Table, TableStyle, HRFlowable
from reportlab.lib.styles import getSampleStyleSheet, ParagraphStyle

def gerar_pdf(json_path, pdf_path):
    with open(json_path, 'r', encoding='utf-8') as f:
        dados = json.load(f)

    doc = SimpleDocTemplate(
        str(pdf_path),
        pagesize=letter,
        rightMargin=40,
        leftMargin=40,
        topMargin=40,
        bottomMargin=40
    )

    styles = getSampleStyleSheet()
    
    # Cores Brana
    AZUL_BRANA = colors.HexColor("#1F4E79")
    AZUL_ESCURO = colors.HexColor("#0D233A")
    CINZA_TEXTO = colors.HexColor("#2C3E50")
    CINZA_CLARO = colors.HexColor("#F8F9FA")
    
    title_style = ParagraphStyle(
        'DocTitle',
        parent=styles['Normal'],
        fontName='Helvetica-Bold',
        fontSize=20,
        leading=24,
        textColor=AZUL_BRANA,
        spaceAfter=6
    )
    
    subtitle_style = ParagraphStyle(
        'DocSubTitle',
        parent=styles['Normal'],
        fontName='Helvetica-Bold',
        fontSize=11,
        leading=15,
        textColor=AZUL_ESCURO,
        spaceAfter=12
    )

    h1_style = ParagraphStyle(
        'SectionH1',
        parent=styles['Normal'],
        fontName='Helvetica-Bold',
        fontSize=12,
        leading=16,
        textColor=colors.white,
        spaceBefore=0,
        spaceAfter=0
    )

    label_style = ParagraphStyle(
        'FieldLabel',
        parent=styles['Normal'],
        fontName='Helvetica-Bold',
        fontSize=9,
        leading=12,
        textColor=AZUL_BRANA
    )

    value_style = ParagraphStyle(
        'FieldValue',
        parent=styles['Normal'],
        fontName='Helvetica',
        fontSize=9,
        leading=12,
        textColor=CINZA_TEXTO
    )

    instrucoes_style = ParagraphStyle(
        'Instrucoes',
        parent=styles['Normal'],
        fontName='Helvetica-Oblique',
        fontSize=8.5,
        leading=12,
        textColor=colors.HexColor("#555555")
    )

    story = []

    # Cabeçalho
    story.append(Paragraph("Caso de Uso — Requisitos de Embarcação", title_style))
    story.append(Paragraph(f"<b>Projetista:</b> {dados.get('projetista', 'N/A')} &nbsp;&nbsp;|&nbsp;&nbsp; <b>Data:</b> {dados.get('data', '15/09/2026')}", subtitle_style))
    story.append(HRFlowable(width="100%", thickness=1.5, color=AZUL_BRANA, spaceBefore=0, spaceAfter=8))
    
    instrucoes = (
        "Documento oficial de definição de requisitos, missão e diretrizes de arquitetura naval da embarcação. "
        "Base para o estudo de similares, plano de linhas, hidrostática e arranjo geral."
    )
    story.append(Paragraph(instrucoes, instrucoes_style))
    story.append(Spacer(1, 10))

    SECOES = [
        ("1. Missão", [
            ("Uso principal da embarcação", "uso_principal"),
            ("Papel principal do barco", "papel_principal"),
        ]),
        ("2. Perfil do Usuário & Tripulação", [
            ("Usuário principal", "usuario_principal"),
            ("O usuário é também o proprietário?", "usuario_e_dono"),
            ("Quem irá pilotar a embarcação", "quem_pilota"),
            ("Pernoite (capacidade e acomodação)", "pernoite"),
            ("O que mais valoriza durante o trajeto", "gosta_caminho"),
            ("O que mais valoriza enquanto ancorado/parado", "gosta_parado"),
            ("Exigências especiais / Conforto a bordo", "outros_desejos"),
            ("Tripulantes em pernoite / Lotação diurna", "tripulantes_max_pernoite"),
            ("Frequência de uso / Travessias contínuas", "dias_continuos"),
        ]),
        ("3. Área de Navegação", [
            ("Região", "regiao"),
            ("Derrota habitual (ponto inicial, final e distância)", "derrota"),
            ("Pontes, eclusas e obstáculos aéreos", "pontes_eclusas"),
            ("Clima e regime de ventos/ondas", "vento_ondas"),
            ("Regime de marés e variações", "mare"),
            ("Restrição de calado (calado máximo)", "restricao_calado"),
            ("Restrições gerais / Zonas rasas", "restricoes_gerais"),
        ]),
        ("4. Orçamento", [
            ("Orçamento total para construção/aquisição", "orcamento_total"),
            ("Capacidade de desembolso", "desembolso_mensal"),
            ("Manutenção e gestão", "mantido_por"),
        ]),
        ("5. Construtor & Método Construtivo", [
            ("Construtor / Estaleiro", "construtor"),
            ("Tipo de construtor / Experiência", "tipo_construtor"),
            ("Material principal de construção", "material"),
            ("Método de construção", "metodo_construcao"),
        ]),
        ("6. Propulsão & Energia", [
            ("Propulsão principal", "propulsao"),
            ("Armação vélica", "armacao"),
            ("Motorização auxiliar", "motorizacao"),
            ("Geração de energia", "outros_desejos"),
            ("Performance esperada", "performance"),
        ]),
        ("7. Dimensões Principais de Projeto", [
            ("Comprimento Fora a Fora (LOA)", "loa"),
            ("Boca Máxima (BOA)", "boca"),
            ("Pontal de Moldado", "pontal"),
            ("Calado de Projeto", "calado"),
            ("Justificativa técnica das dimensões", "justificativa_dimensoes"),
        ]),
    ]

    for titulo_secao, campos in SECOES:
        # Header da seção
        header_table = Table([[Paragraph(titulo_secao, h1_style)]], colWidths=[532])
        header_table.setStyle(TableStyle([
            ('BACKGROUND', (0,0), (-1,-1), AZUL_BRANA),
            ('TOPPADDING', (0,0), (-1,-1), 4),
            ('BOTTOMPADDING', (0,0), (-1,-1), 4),
            ('LEFTPADDING', (0,0), (-1,-1), 8),
            ('RIGHTPADDING', (0,0), (-1,-1), 8),
        ]))
        story.append(header_table)

        # Tabela de dados
        table_data = []
        for rotulo, chave in campos:
            val = dados.get(chave, "N/A")
            val_str = str(val).strip() if val not in (None, "") else "N/A"
            p_label = Paragraph(f"<b>{rotulo}:</b>", label_style)
            p_val = Paragraph(val_str, value_style)
            table_data.append([p_label, p_val])

        t = Table(table_data, colWidths=[180, 352])
        t.setStyle(TableStyle([
            ('BACKGROUND', (0,0), (-1,-1), colors.white),
            ('VALIGN', (0,0), (-1,-1), 'TOP'),
            ('ROWBACKGROUNDS', (0,0), (-1,-1), [colors.white, CINZA_CLARO]),
            ('TOPPADDING', (0,0), (-1,-1), 3),
            ('BOTTOMPADDING', (0,0), (-1,-1), 3),
            ('LEFTPADDING', (0,0), (-1,-1), 6),
            ('RIGHTPADDING', (0,0), (-1,-1), 6),
            ('LINEBELOW', (0,0), (-1,-1), 0.5, colors.HexColor("#E2E8F0")),
        ]))
        story.append(t)
        story.append(Spacer(1, 8))

    doc.build(story)
    print(f"PDF gerado com sucesso: {pdf_path}")

if __name__ == "__main__":
    json_in = Path("/home/magdalena/eee/alunos/adalfredo-oliveira-santanna-filho/caso_de_uso_dados.json")
    pdf_out = Path("/home/magdalena/eee/alunos/adalfredo-oliveira-santanna-filho/Caso_de_Uso_Adalfredo_Oliveira_Santanna_Filho.pdf")
    gerar_pdf(json_in, pdf_out)
