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

json_path = "/home/magdalena/eee/alunos/ricardo-teixeira/respostas_caso_de_uso.json"
pdf_path = "/home/magdalena/eee/alunos/ricardo-teixeira/Caso_de_Uso_Ricardo_Teixeira.pdf"

with open(json_path, encoding='utf-8') as f:
    d = json.load(f)

doc = SimpleDocTemplate(
    pdf_path,
    pagesize=A4,
    leftMargin=35,
    rightMargin=35,
    topMargin=35,
    bottomMargin=35
)

styles = getSampleStyleSheet()

primary_color = colors.HexColor("#1F4E79")
secondary_color = colors.HexColor("#2B6CB0")
dark_neutral = colors.HexColor("#2D3748")
light_bg = colors.HexColor("#F7FAFC")
border_color = colors.HexColor("#CBD5E0")

title_style = ParagraphStyle(
    'H1_Box',
    parent=styles['Normal'],
    fontName='Helvetica-Bold',
    fontSize=13,
    leading=17,
    textColor=colors.white,
    alignment=1
)

sub_box_style = ParagraphStyle(
    'Sub_Box',
    parent=styles['Normal'],
    fontName='Helvetica',
    fontSize=9,
    leading=12,
    textColor=colors.white,
    alignment=1
)

sec_title = ParagraphStyle(
    'SecTitle',
    parent=styles['Normal'],
    fontName='Helvetica-Bold',
    fontSize=11,
    leading=15,
    textColor=primary_color,
    spaceBefore=6,
    spaceAfter=3
)

label_style = ParagraphStyle(
    'Label',
    parent=styles['Normal'],
    fontName='Helvetica-Bold',
    fontSize=8.5,
    leading=12,
    textColor=primary_color
)

val_style = ParagraphStyle(
    'Val',
    parent=styles['Normal'],
    fontName='Helvetica',
    fontSize=8.5,
    leading=12,
    textColor=dark_neutral
)

inst_style = ParagraphStyle(
    'Inst',
    parent=styles['Normal'],
    fontName='Helvetica-Oblique',
    fontSize=8,
    leading=11,
    textColor=dark_neutral
)

elements = []

# Header Box
header_data = [
    [Paragraph("<b>CURSO DE DESIGN PROFISSIONAL DE EMBARCAÇÕES</b><br/>BRANA & ESTALEIRO ESCOLA EMBRIÃO (EEE)", sub_box_style)],
    [Paragraph("CASO DE USO — REQUISITOS DE PROJETO", title_style)]
]
h_table = Table(header_data, colWidths=[525])
h_table.setStyle(TableStyle([
    ('BACKGROUND', (0,0), (-1,-1), primary_color),
    ('ALIGN', (0,0), (-1,-1), 'CENTER'),
    ('VALIGN', (0,0), (-1,-1), 'MIDDLE'),
    ('TOPPADDING', (0,0), (-1,-1), 5),
    ('BOTTOMPADDING', (0,0), (-1,-1), 5),
]))
elements.append(h_table)
elements.append(Spacer(1, 6))

# Meta
meta_data = [
    [Paragraph(f"<b>Projetista:</b> {d['projetista']}", val_style), Paragraph(f"<b>Data:</b> {d['data']}", val_style)],
    [Paragraph("<b>Projeto:</b> Saveiro Tradicional de Carga (7,50 m)", val_style), Paragraph("<b>Origem / Destino:</b> Maragogipe - Salvador", val_style)]
]
m_table = Table(meta_data, colWidths=[315, 210])
m_table.setStyle(TableStyle([
    ('BACKGROUND', (0,0), (-1,-1), light_bg),
    ('BOX', (0,0), (-1,-1), 0.5, border_color),
    ('INNERGRID', (0,0), (-1,-1), 0.5, border_color),
    ('TOPPADDING', (0,0), (-1,-1), 3),
    ('BOTTOMPADDING', (0,0), (-1,-1), 3),
    ('LEFTPADDING', (0,0), (-1,-1), 6),
    ('RIGHTPADDING', (0,0), (-1,-1), 6),
]))
elements.append(m_table)
elements.append(Spacer(1, 6))

# Instruções
elements.append(Paragraph("<b>Instruções:</b> <i>Despenda algum tempo refletindo sobre os requisitos e uso da embarcação a ser desenvolvida. Uma embarcação é uma solução de compromisso entre requisitos conflitantes; este questionário irá nos ajudar a priorizar estas demandas. Lembre que um barco precisa de uma missão, tarefa ou propósito a ser cumprido, este será nosso norte nas escolhas de projeto.</i>", inst_style))
elements.append(Spacer(1, 6))

def render_section(titulo, campos):
    t_rows = []
    for rotulo, val in campos:
        t_rows.append([
            Paragraph(f"• <b>{rotulo}:</b>", label_style),
            Paragraph(str(val), val_style)
        ])
    t = Table(t_rows, colWidths=[160, 365])
    t.setStyle(TableStyle([
        ('VALIGN', (0,0), (-1,-1), 'TOP'),
        ('TOPPADDING', (0,0), (-1,-1), 2),
        ('BOTTOMPADDING', (0,0), (-1,-1), 2),
        ('LEFTPADDING', (0,0), (-1,-1), 0),
        ('RIGHTPADDING', (0,0), (-1,-1), 0),
    ]))
    return t

# 1. Missão
elements.append(Paragraph("1. Missão", sec_title))
elements.append(HRFlowable(width="100%", thickness=1, color=secondary_color, spaceAfter=4, spaceBefore=1))
elements.append(render_section("Missão", [
    ("Uso principal da embarcação", d["uso_principal"]),
    ("Papel mais importante a cumprir", d["papel_principal"]),
]))
elements.append(Spacer(1, 4))

# 2. Perfil do Usuário
elements.append(Paragraph("2. Perfil do Usuário", sec_title))
elements.append(HRFlowable(width="100%", thickness=1, color=secondary_color, spaceAfter=4, spaceBefore=1))
elements.append(render_section("Perfil do Usuário", [
    ("Usuário principal", d["usuario_principal"]),
    ("Usuário é o proprietário?", d["usuario_e_dono"]),
    ("Quem irá pilotar", d["quem_pilota"]),
    ("Pernoite a bordo", d["pernoite"]),
    ("Durante o caminho mais valoriza", d["gosta_caminho"]),
    ("Enquanto parado mais valoriza", d["gosta_parado"]),
    ("Outros requisitos / desejos", d["outros_desejos"]),
    ("Tripulantes em navegação (médio)", d["tripulantes_medio"]),
    ("Operação portuária (máximo dia)", d["tripulantes_max_dia"]),
    ("Local de residência e base", f"{d['residencia']} ({d['tipo_casa']})"),
    ("Regime e frequência de uso", f"{d['dias_ano']} ({d['dias_continuos']})"),
]))
elements.append(Spacer(1, 4))

# 3. Área de Navegação
elements.append(Paragraph("3. Área de Navegação", sec_title))
elements.append(HRFlowable(width="100%", thickness=1, color=secondary_color, spaceAfter=4, spaceBefore=1))
elements.append(render_section("Área de Navegação", [
    ("Região de operação", d["regiao"]),
    ("Derrota habitual e distância", d["derrota"]),
    ("Pontes e eclusas no trajeto", d["pontes_eclusas"]),
    ("Clima e ventos / ondas", f"{d['clima']} | {d['vento_ondas']}"),
    ("Chuvas e regime de maré", f"{d['chuvas']} | {d['mare']}"),
    ("Restrição de calado crítica", d["restricao_calado"]),
    ("Regime de tempo e travessia", f"{d['tempo_operacao']} | {d['travessia_max']}"),
]))
elements.append(Spacer(1, 4))

# 4. Orçamento
elements.append(Paragraph("4. Orçamento", sec_title))
elements.append(HRFlowable(width="100%", thickness=1, color=secondary_color, spaceAfter=4, spaceBefore=1))
elements.append(render_section("Orçamento", [
    ("Orçamento total de construção", d["orcamento_total"]),
    ("Desembolso e viabilidade", d["desembolso_mensal"]),
    ("Manutenção e conservação anual", d["orcamento_manutencao"]),
    ("Mantido por", d["mantido_por"]),
]))
elements.append(Spacer(1, 4))

# 5. Construtor e Materiais
elements.append(Paragraph("5. Construtor e Materiais", sec_title))
elements.append(HRFlowable(width="100%", thickness=1, color=secondary_color, spaceAfter=4, spaceBefore=1))
elements.append(render_section("Construtor", [
    ("Construtor / Tipo", f"{d['construtor']} ({d['tipo_construtor']})"),
    ("Experiência profissional", f"{d['experiencia_construtor']} - {d['tipo_embarcacao_experiencia']} ({d['faixa_tamanho_experiencia']})"),
    ("Material de construção", d["material"]),
    ("Método construtivo", d["metodo_construcao"]),
]))
elements.append(Spacer(1, 4))

# 6. Propulsão
elements.append(Paragraph("6. Propulsão e Outros Requisitos", sec_title))
elements.append(HRFlowable(width="100%", thickness=1, color=secondary_color, spaceAfter=4, spaceBefore=1))
elements.append(render_section("Propulsão", [
    ("Propulsão principal e apoio", d["propulsao"]),
    ("Motorização auxiliar", d["motorizacao"]),
    ("Armação vélica", d["armacao"]),
    ("Requisitos de performance", d["performance"]),
]))
elements.append(Spacer(1, 4))

# 7. Dimensões Principais
elements.append(Paragraph("7. Dimensões Principais Propostas e Confirmadas", sec_title))
elements.append(HRFlowable(width="100%", thickness=1, color=secondary_color, spaceAfter=4, spaceBefore=1))
elements.append(render_section("Dimensões Principais", [
    ("Comprimento Total (LOA)", d["loa"]),
    ("Boca Máxima (BOA)", d["boca"]),
    ("Pontal a Meio-Navio (D)", d["pontal"]),
    ("Calado Carregado (T)", d["calado"]),
    ("Justificativa técnica das dimensões", d["justificativa_dimensoes"]),
]))
elements.append(Spacer(1, 6))

elements.append(Paragraph("<i>Documento técnico oficial emitido no padrão do Curso de Design Profissional de Embarcações — Brana / EEE.</i>", inst_style))

doc.build(elements)
print("PDF oficial gerado com sucesso!")
