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

JSON_PATH = "/home/magdalena/eee/alunos/47356812742818-maximo/similares_maximo.json"
PDF_OUT = "/home/magdalena/eee/alunos/47356812742818-maximo/Estudo_de_Similar_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)

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=14,
    spaceAfter=6
)

p_style = ParagraphStyle(
    'BodyP',
    parent=styles['Normal'],
    fontName='Helvetica',
    fontSize=9.5,
    leading=14,
    textColor=colors.HexColor('#333333'),
    spaceAfter=8
)

bold_label = ParagraphStyle(
    'BoldLabel',
    parent=styles['Normal'],
    fontName='Helvetica-Bold',
    fontSize=9,
    leading=12,
    textColor=colors.HexColor('#0F2A4A')
)

cell_text = ParagraphStyle(
    'CellText',
    parent=styles['Normal'],
    fontName='Helvetica',
    fontSize=8.5,
    leading=11,
    textColor=colors.HexColor('#222222')
)

cell_header = ParagraphStyle(
    'CellHeader',
    parent=styles['Normal'],
    fontName='Helvetica-Bold',
    fontSize=8.5,
    leading=11,
    textColor=colors.white,
    alignment=1
)

story = []

story.append(Paragraph("Estudo de Similares — Análise Paramétrica", title_style))
story.append(Paragraph(f"<b>Projetista:</b> {data.get('projetista', 'Maximo')} | <b>Data:</b> 15/09/2026 | <b>Embarcação Pretendida:</b> {data.get('embarcacao_pretendida', '')}", subtitle_style))

# 1. Resumo do Caso de Uso e Critérios
story.append(Paragraph("1. Caso de Uso e Critérios de Seleção", h1_style))
story.append(Paragraph(f"<b>Caso de Uso:</b> {data.get('caso_de_uso_resumo', '')}", p_style))
story.append(Paragraph(f"<b>Critérios de Seleção:</b> {data.get('criterios_selecao', '')}", p_style))

# 2. Embarcações Similares Pesquisadas
story.append(Paragraph("2. Embarcações Selecionadas para o Estudo", h1_style))

for i, sim in enumerate(data.get("similares", []), 1):
    sim_title = f"<b>Similar {i}: {sim['nome']}</b> — {sim['estaleiro']} ({sim.get('ano', 'N/A')})"
    story.append(Paragraph(sim_title, bold_label))
    story.append(Paragraph(f"<i>Por que se parece:</i> {sim.get('porque_similar', '')}", p_style))
    
    # Imagem se houver
    if sim.get("foto") and os.path.exists(sim["foto"]):
        try:
            img = Image(sim["foto"], width=240, height=140)
            story.append(img)
            if sim.get("foto_credito"):
                story.append(Paragraph(f"<font size=7 color='#666666'>Fonte da foto: {sim['foto_credito']}</font>", p_style))
        except Exception as e:
            pass
    
    # Fonte
    for f_item in sim.get("fontes", []):
        story.append(Paragraph(f"<font size=8 color='#555555'><b>Fonte:</b> {f_item['nome']} | <a href='{f_item['url']}'>{f_item['url']}</a> (Acesso: {f_item.get('data_acesso', 'N/A')})</font>", p_style))
    story.append(Spacer(1, 6))

story.append(PageBreak())

# 3. Tabela Comparativa em SI
story.append(Paragraph("3. Tabela Comparativa de Parâmetros (Sistema Internacional - SI)", h1_style))

headers = ["Parâmetro", "Barco Pretendido", "Saffier SC 6.50", "Seascape 18", "Flying Dutchman", "Daysailer 17"]

table_rows = [
    [Paragraph(h, cell_header) for h in headers]
]

data_matrix = [
    ("LOA (Comprimento Total)", "5,80 m", "6,50 m", "5,50 m", "6,10 m", "5,11 m"),
    ("LWL (Comprimento Linha d'Água)", "5,25 m", "—", "—", "—", "4,72 m"),
    ("BOA (Boca Máxima)", "1,90 m", "2,05 m", "2,37 m", "1,80 m", "1,91 m"),
    ("Calado Máximo", "1,10 m (bolina)", "0,95 m (quilha)", "1,50 m (bolina)", "—", "1,14 m (bolina)"),
    ("Calado Mínimo", "0,25 m", "0,95 m", "0,18 m", "—", "0,23 m"),
    ("Pontal", "0,75 m", "—", "—", "—", "—"),
    ("Deslocamento / Peso", "350 kg (est.)", "900 kg", "567 kg", "130 kg (casco)", "261 kg"),
    ("Área Vélica Principal", "16,0 - 18,0 m²", "22,0 m²", "23,7 m²", "18,6 m²", "13,5 m²"),
    ("Relação LOA / BOA", "3,05", "3,17", "2,32", "3,39", "2,67"),
    ("Tipo de Apêndice", "Bolina retrátil", "Quilha fixa c/ bulbo", "Bolina retrátil", "Bolina retrátil", "Bolina retrátil"),
    ("Material Típico", "Madeira ripada / epóxi", "Fibra de Vidro (GRP)", "Fibra de Vidro (GRP)", "Madeira / Fibra", "Fibra de Vidro (GRP)"),
]

for row in data_matrix:
    r_cells = [Paragraph(row[0], bold_label)]
    for val in row[1:]:
        r_cells.append(Paragraph(val, cell_text))
    table_rows.append(r_cells)

t_comp = Table(table_rows, colWidths=[130, 75, 75, 75, 75, 75])
t_comp.setStyle(TableStyle([
    ('BACKGROUND', (0, 0), (-1, 0), colors.HexColor('#0F2A4A')),
    ('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), 4),
    ('RIGHTPADDING', (0, 0), (-1, -1), 4),
    ('VALIGN', (0, 0), (-1, -1), 'MIDDLE'),
    ('BACKGROUND', (1, 1), (1, -1), colors.HexColor('#EFF6FF')), # Destaque na coluna do barco pretendido
]))

story.append(t_comp)
story.append(Spacer(1, 10))

# 4. Leitura Paramétrica e Recomendações
story.append(Paragraph("4. Leitura Paramétrica e Análise de Engenharia", h1_style))
story.append(Paragraph(f"{data.get('leitura_parametrica', '')}", p_style))

story.append(Paragraph("5. Recomendações Preliminares de Projeto", h1_style))
story.append(Paragraph(f"{data.get('recomendacao', '')}", p_style))

story.append(Paragraph("6. Lacunas e Observações", h1_style))
story.append(Paragraph(f"{data.get('observacoes', '')}", p_style))

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

# Merge com timbrado Brana
raw_pdf = PdfReader(buffer)
writer = PdfWriter()

if os.path.exists(TIMBRADO_PDF):
    timbrado_reader = PdfReader(TIMBRADO_PDF)
    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"Estudo de Similar em PDF gerado: {PDF_OUT}")
