import json
import os
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, PageBreak, KeepTogether
from reportlab.pdfgen import canvas
from pypdf import PdfReader, PdfWriter
import io

JSON_PATH = "/home/magdalena/eee/alunos/47356812742818-maximo/respostas_caso_de_uso.json"
PDF_OUT = "/home/magdalena/eee/alunos/47356812742818-maximo/Caso_de_Uso_Maximo.pdf"
TIMBRADO_PDF = "/home/magdalena/.hermes/plugins/iarquiteto-naval-brana/skills/brana-area-navegacao/assets/timbrado_brana.pdf"

with open(JSON_PATH, "r", encoding="utf-8") as f:
    data = json.load(f)

SECOES = [
    ("1. Missão", [
        ("Uso principal da embarcação", data.get("uso_principal", "N/A")),
        ("Papel mais importante que o barco precisa cumprir", data.get("papel_principal", "N/A")),
    ]),
    ("2. Perfil do Usuário", [
        ("Usuário principal", data.get("usuario_principal", "N/A")),
        ("O usuário principal é também o proprietário?", data.get("usuario_e_dono", "N/A")),
        ("Quem irá pilotar a embarcação", data.get("quem_pilota", "N/A")),
        ("Pernoite", data.get("pernoite", "N/A")),
        ("O que mais gosta durante o caminho", data.get("gosta_caminho", "N/A")),
        ("O que mais gosta enquanto parado", data.get("gosta_parado", "N/A")),
        ("Outros desejos do usuário ou capitão", data.get("outros_desejos", "N/A")),
        ("Usuários em potencial", data.get("usuarios_potenciais", "N/A")),
        ("Tipo de grupo", data.get("tipo_grupo", "N/A")),
        ("Número médio de tripulantes", data.get("tripulantes_medio", "N/A")),
        ("Número máximo de tripulantes (dia)", data.get("tripulantes_max_dia", "N/A")),
        ("Número máximo de tripulantes (pernoite)", data.get("tripulantes_max_pernoite", "N/A")),
        ("Local de residência do usuário principal", data.get("residencia", "N/A")),
        ("Média anual de dias utilizando a embarcação", data.get("dias_ano", "N/A")),
        ("Média anual (dias) de uso contínuo", data.get("dias_continuos", "N/A")),
    ]),
    ("3. Área de Navegação", [
        ("Região", data.get("regiao", "N/A")),
        ("Derrota habitual", data.get("derrota", "N/A")),
        ("Pontes e eclusas no trajeto", data.get("pontes_eclusas", "N/A")),
        ("Clima", data.get("clima", "N/A")),
        ("Vento / ondas", data.get("vento_ondas", "N/A")),
        ("Regime de chuvas", data.get("chuvas", "N/A")),
        ("Variação de maré", data.get("mare", "N/A")),
        ("Restrição de calado", data.get("restricao_calado", "N/A")),
        ("Outras informações relevantes / restrições", data.get("restricoes_gerais", "N/A")),
        ("Operação - tempo", data.get("tempo_operacao", "N/A")),
        ("Travessias (distância máxima)", data.get("travessia_max", "N/A")),
    ]),
    ("4. Orçamento", [
        ("Orçamento total para construção/aquisição", data.get("orcamento_total", "N/A")),
        ("Capacidade de desembolso mensal", data.get("desembolso_mensal", "N/A")),
        ("Orçamento anual para manutenção/melhorias", data.get("orcamento_manutencao", "N/A")),
        ("Mantido por", data.get("mantido_por", "N/A")),
    ]),
    ("5. Construtor", [
        ("Construtor / Estaleiro", data.get("construtor", "N/A")),
        ("Tipo de construtor", data.get("tipo_construtor", "N/A")),
        ("Experiência do construtor/estaleiro", data.get("experiencia_construtor", "N/A")),
        ("Material de construção", data.get("material", "N/A")),
        ("Método de construção", data.get("metodo_construcao", "N/A")),
        ("Faixa de tamanho em que tem experiência", data.get("faixa_tamanho_experiencia", "N/A")),
        ("Tipo de embarcação em que tem experiência", data.get("tipo_embarcacao_experiencia", "N/A")),
    ]),
    ("6. Outros Requisitos / Propulsão", [
        ("Propulsão principal", data.get("propulsao", "N/A")),
        ("Motorização", data.get("motorizacao", "N/A")),
        ("Armação (veleiros)", data.get("armacao", "N/A")),
        ("Requisitos de performance", data.get("performance", "N/A")),
    ]),
    ("7. Dimensões Principais", [
        ("Comprimento (LOA)", data.get("loa", "N/A")),
        ("Boca (BOA)", data.get("boca", "N/A")),
        ("Pontal", data.get("pontal", "N/A")),
        ("Calado", data.get("calado", "N/A")),
        ("Justificativa das dimensões", data.get("justificativa_dimensoes", "N/A")),
    ]),
]

buffer = io.BytesIO()
doc = SimpleDocTemplate(
    buffer,
    pagesize=A4,
    leftMargin=45,
    rightMargin=45,
    topMargin=70,
    bottomMargin=60
)

styles = getSampleStyleSheet()

title_style = ParagraphStyle(
    'DocTitle',
    parent=styles['Normal'],
    fontName='Helvetica-Bold',
    fontSize=18,
    leading=22,
    textColor=colors.HexColor('#0F2A4A'),
    spaceAfter=4,
    alignment=0
)

subtitle_style = ParagraphStyle(
    'DocSubtitle',
    parent=styles['Normal'],
    fontName='Helvetica',
    fontSize=10,
    leading=14,
    textColor=colors.HexColor('#555555'),
    spaceAfter=15,
    alignment=0
)

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

label_style = ParagraphStyle(
    'CellLabel',
    parent=styles['Normal'],
    fontName='Helvetica-Bold',
    fontSize=9,
    leading=12,
    textColor=colors.HexColor('#222222')
)

val_style = ParagraphStyle(
    'CellValue',
    parent=styles['Normal'],
    fontName='Helvetica',
    fontSize=9,
    leading=12,
    textColor=colors.HexColor('#333333')
)

story = []
story.append(Paragraph("Caso de Uso — Requisitos de Embarcação", title_style))
story.append(Paragraph(f"<b>Projetista:</b> {data.get('projetista', 'Maximo')} | <b>Data:</b> 15/09/2026 | <b>Escola:</b> Brana / Estaleiro Escola", subtitle_style))

for sec_title, items in SECOES:
    story.append(Paragraph(sec_title, h1_style))
    table_data = []
    for label, val in items:
        p_label = Paragraph(label, label_style)
        p_val = Paragraph(str(val), val_style)
        table_data.append([p_label, p_val])
    
    t = Table(table_data, colWidths=[185, 320])
    t.setStyle(TableStyle([
        ('BACKGROUND', (0, 0), (-1, -1), colors.HexColor('#F8FAFC')),
        ('BOX', (0, 0), (-1, -1), 0.5, colors.HexColor('#CBD5E1')),
        ('INNERGRID', (0, 0), (-1, -1), 0.5, colors.HexColor('#E2E8F0')),
        ('TOPPADDING', (0, 0), (-1, -1), 4),
        ('BOTTOMPADDING', (0, 0), (-1, -1), 4),
        ('LEFTPADDING', (0, 0), (-1, -1), 6),
        ('RIGHTPADDING', (0, 0), (-1, -1), 6),
        ('VALIGN', (0, 0), (-1, -1), 'TOP'),
    ]))
    story.append(t)
    story.append(Spacer(1, 6))

doc.build(story)
buffer.seek(0)

# Merge com timbrado se disponível
raw_pdf = PdfReader(buffer)
writer = PdfWriter()

if os.path.exists(TIMBRADO_PDF):
    timbrado_reader = PdfReader(TIMBRADO_PDF)
    timbrado_page = timbrado_reader.pages[0]
    for page in raw_pdf.pages:
        new_page = PdfReader(io.BytesIO(open(TIMBRADO_PDF, "rb").read())).pages[0]
        new_page.merge_page(page)
        writer.add_page(new_page)
else:
    for page in raw_pdf.pages:
        writer.add_page(page)

with open(PDF_OUT, "wb") as f_out:
    writer.write(f_out)

print(f"Gerado com sucesso: {PDF_OUT}")
