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, PageBreak, KeepTogether, HRFlowable
)
from reportlab.lib.styles import getSampleStyleSheet, ParagraphStyle
from reportlab.pdfgen import canvas

json_path = Path("/home/magdalena/eee/alunos/victor-lei/similares_dados.json")
dados = json.loads(json_path.read_text(encoding="utf-8"))

pdf_path = "/home/magdalena/eee/alunos/victor-lei/Estudo_de_Similar_Victor_Lei.pdf"

class NumberedCanvas(canvas.Canvas):
    def __init__(self, *args, **kwargs):
        super().__init__(*args, **kwargs)
        self._saved_page_states = []

    def showPage(self):
        self._saved_page_states.append(dict(self.__dict__))
        self._startPage()

    def save(self):
        num_pages = len(self._saved_page_states)
        for state in self._saved_page_states:
            self.__dict__.update(state)
            self.draw_page_elements(num_pages)
            super().showPage()
        super().save()

    def draw_page_elements(self, page_count):
        self.saveState()
        self.setFont("Helvetica", 8)
        self.setFillColor(colors.HexColor("#718096"))
        
        # Header (página 2+)
        if self._pageNumber > 1:
            self.drawString(54, 750, "BRANA PROJETOS NAVAIS — ESTUDO DE SIMILARES (PARAMETRIC STUDY)")
            self.drawRightString(612 - 54, 750, f"PROJETISTA: {dados.get('projetista', '').upper()}")
            self.setStrokeColor(colors.HexColor("#E2E8F0"))
            self.setLineWidth(0.5)
            self.line(54, 742, 612 - 54, 742)
        
        # Footer
        self.setStrokeColor(colors.HexColor("#CBD5E0"))
        self.setLineWidth(0.5)
        self.line(54, 45, 612 - 54, 45)
        self.drawString(54, 32, "Brana · Escola de Arquitetura e Engenharia Naval | Estaleiro Escola Embrião (EEE)")
        self.drawRightString(612 - 54, 32, f"Página {self._pageNumber} de {page_count}")
        self.restoreState()

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

styles = getSampleStyleSheet()

cor_primaria = colors.HexColor("#1A365D")   # Azul Marinho Brana
cor_secundaria = colors.HexColor("#2B6CB0") # Azul Médio
cor_fundo_tabela = colors.HexColor("#F7FAFC")
cor_borda = colors.HexColor("#CBD5E0")
cor_destaque = colors.HexColor("#2C5282")

style_titulo = ParagraphStyle(
    'DocTitle',
    parent=styles['Normal'],
    fontName='Helvetica-Bold',
    fontSize=20,
    leading=24,
    textColor=cor_primaria,
    spaceAfter=4
)

style_subtitulo = ParagraphStyle(
    'DocSubTitle',
    parent=styles['Normal'],
    fontName='Helvetica-Bold',
    fontSize=11,
    leading=14,
    textColor=cor_secundaria,
    spaceAfter=14
)

style_secao_titulo = ParagraphStyle(
    'SectionHeading',
    parent=styles['Normal'],
    fontName='Helvetica-Bold',
    fontSize=11,
    leading=14,
    textColor=colors.white,
    spaceBefore=0,
    spaceAfter=0
)

style_subsecao_titulo = ParagraphStyle(
    'SubSectionHeading',
    parent=styles['Normal'],
    fontName='Helvetica-Bold',
    fontSize=10,
    leading=13,
    textColor=cor_primaria,
    spaceBefore=4,
    spaceAfter=2
)

style_corpo = ParagraphStyle(
    'BodyDark',
    parent=styles['Normal'],
    fontName='Helvetica',
    fontSize=9,
    leading=13,
    textColor=colors.HexColor("#2D3748")
)

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

style_td = ParagraphStyle(
    'TableCell',
    parent=styles['Normal'],
    fontName='Helvetica',
    fontSize=8,
    leading=11,
    textColor=colors.HexColor("#2D3748"),
    alignment=1
)

style_td_label = ParagraphStyle(
    'TableCellLabel',
    parent=styles['Normal'],
    fontName='Helvetica-Bold',
    fontSize=8,
    leading=11,
    textColor=cor_primaria,
    alignment=0
)

story = []

# Título
story.append(Paragraph("ESTUDO DE SIMILARES (PESQUISA PARAMÉTRICA)", style_titulo))
story.append(Paragraph(f"Embarcação Pretendida: Lancha Clássica de Madeira de até 16 pés<br/>Projetista: <b>{dados.get('projetista', 'N/A')}</b> &nbsp;|&nbsp; Data: {dados.get('data', 'N/A')}", style_subtitulo))

# Resumo do Caso de Uso & Critérios
inst_card = [
    [Paragraph("<b>Resumo do Caso de Uso:</b> " + dados.get("caso_de_uso_resumo", ""), style_corpo)],
    [Paragraph("<b>Critérios de Seleção:</b> " + dados.get("criterios_selecao", ""), style_corpo)]
]
t_card = Table(inst_card, colWidths=[504])
t_card.setStyle(TableStyle([
    ('BACKGROUND', (0,0), (-1,-1), colors.HexColor("#EDF2F7")),
    ('BOX', (0,0), (-1,-1), 1, colors.HexColor("#CBD5E0")),
    ('TOPPADDING', (0,0), (-1,-1), 6),
    ('BOTTOMPADDING', (0,0), (-1,-1), 6),
    ('LEFTPADDING', (0,0), (-1,-1), 8),
    ('RIGHTPADDING', (0,0), (-1,-1), 8),
]))
story.append(t_card)
story.append(Spacer(1, 12))

# 1. Embarcações Selecionadas
t_h1 = Table([[Paragraph("1. EMBARCAÇÕES SELECIONADAS PARA O ESTUDO", style_secao_titulo)]], colWidths=[504])
t_h1.setStyle(TableStyle([
    ('BACKGROUND', (0,0), (-1,-1), cor_primaria),
    ('TOPPADDING', (0,0), (-1,-1), 4),
    ('BOTTOMPADDING', (0,0), (-1,-1), 4),
    ('LEFTPADDING', (0,0), (-1,-1), 8),
]))
story.append(t_h1)

similares_info = []
for i, sim in enumerate(dados.get("similares", []), 1):
    sim_text = f"<b>Similar {i}: {sim.get('estaleiro')} {sim.get('nome')} ({sim.get('ano')})</b><br/>"
    sim_text += f"• <b>Justificativa:</b> {sim.get('porque_similar')}<br/>"
    fonte_nomes = ", ".join([f"{f.get('nome')} ({f.get('tipo')})" for f in sim.get("fontes", [])])
    sim_text += f"• <b>Fontes consultadas:</b> {fonte_nomes}"
    similares_info.append([Paragraph(sim_text, style_corpo)])

t_sim_info = Table(similares_info, colWidths=[504])
t_sim_info.setStyle(TableStyle([
    ('BACKGROUND', (0,0), (-1,-1), colors.white),
    ('GRID', (0,0), (-1,-1), 0.5, cor_borda),
    ('TOPPADDING', (0,0), (-1,-1), 6),
    ('BOTTOMPADDING', (0,0), (-1,-1), 6),
    ('LEFTPADDING', (0,0), (-1,-1), 8),
    ('RIGHTPADDING', (0,0), (-1,-1), 8),
    ('ROWBACKGROUNDS', (0,0), (-1,-1), [colors.white, cor_fundo_tabela])
]))
story.append(t_sim_info)
story.append(Spacer(1, 12))

# 2. Tabela Comparativa (SI)
t_h2 = Table([[Paragraph("2. MATRIZ PARAMÉTRICA COMPARATIVA (VALORES NO SISTEMA INTERNACIONAL / SI)", style_secao_titulo)]], colWidths=[504])
t_h2.setStyle(TableStyle([
    ('BACKGROUND', (0,0), (-1,-1), cor_primaria),
    ('TOPPADDING', (0,0), (-1,-1), 4),
    ('BOTTOMPADDING', (0,0), (-1,-1), 4),
    ('LEFTPADDING', (0,0), (-1,-1), 8),
]))
story.append(t_h2)

header_row = [
    Paragraph("Parâmetro", style_th),
    Paragraph("Glen-L<br/>Cabin Skiff 16", style_th),
    Paragraph("Glen-L<br/>Cruisette 15", style_th),
    Paragraph("Carbrasmar<br/>Xaréu 21/22", style_th),
    Paragraph("Proposta<br/>Victor Lei (16')", style_th)
]

rows = [
    header_row,
    [Paragraph("Comprimento Total (LOA)", style_td_label), Paragraph("4,95 m (16,3')", style_td), Paragraph("4,57 m (15,0')", style_td), Paragraph("6,45 m (21,2')", style_td), Paragraph("<b>4,88 m (16,0')</b>", style_td)],
    [Paragraph("Boca Máxima (BOA)", style_td_label), Paragraph("2,06 m (6,8')", style_td), Paragraph("1,83 m (6,0')", style_td), Paragraph("2,30 m (7,5')", style_td), Paragraph("<b>2,05 m (6,7')</b>", style_td)],
    [Paragraph("Razão LOA / BOA", style_td_label), Paragraph("2,41", style_td), Paragraph("2,50", style_td), Paragraph("2,80", style_td), Paragraph("<b>2,38</b>", style_td)],
    [Paragraph("Pontal (D)", style_td_label), Paragraph("0,76 m", style_td), Paragraph("0,84 m", style_td), Paragraph("1,73 m (tot)", style_td), Paragraph("<b>0,85 m</b>", style_td)],
    [Paragraph("Calado do Casco (T)", style_td_label), Paragraph("~0,25 m", style_td), Paragraph("0,10 m (casco)", style_td), Paragraph("0,60 m (prop)", style_td), Paragraph("<b>0,28 m</b>", style_td)],
    [Paragraph("Peso Leve / Deslocamento", style_td_label), Paragraph("226,8 kg (casco)", style_td), Paragraph("204,1 kg (casco)", style_td), Paragraph("~1.200 kg", style_td), Paragraph("<b>520 kg (leve) / 1.068 kg (pleno)</b>", style_td)],
    [Paragraph("Potência Recomendada", style_td_label), Paragraph("40 HP", style_td), Paragraph("60 HP", style_td), Paragraph("120 a 170 HP", style_td), Paragraph("<b>50 a 60 HP</b>", style_td)],
    [Paragraph("Tipo de Propulsão", style_td_label), Paragraph("Motor de Popa", style_td), Paragraph("Motor de Popa", style_td), Paragraph("Centro-Rabeta / Popa", style_td), Paragraph("<b>Motor de Popa</b>", style_td)],
    [Paragraph("Material Construtivo", style_td_label), Paragraph("Compensado / Epóxi", style_td), Paragraph("Madeira / Cavernas", style_td), Paragraph("Madeira Maciça / Cedro", style_td), Paragraph("<b>Compensado Naval / Epóxi</b>", style_td)],
    [Paragraph("Acomodações / Lotação", style_td_label), Paragraph("2 leito / 4-6 dia", style_td), Paragraph("2 leito / 4-5 dia", style_td), Paragraph("2 leito / 6-8 dia", style_td), Paragraph("<b>2 leito / 6 dia</b>", style_td)],
]

t_matriz = Table(rows, colWidths=[144, 90, 90, 90, 90])
t_matriz.setStyle(TableStyle([
    ('BACKGROUND', (0,0), (-1,0), cor_destaque),
    ('GRID', (0,0), (-1,-1), 0.5, cor_borda),
    ('VALIGN', (0,0), (-1,-1), 'MIDDLE'),
    ('TOPPADDING', (0,0), (-1,-1), 4),
    ('BOTTOMPADDING', (0,0), (-1,-1), 4),
    ('ROWBACKGROUNDS', (0,1), (-1,-1), [colors.white, cor_fundo_tabela])
]))
story.append(t_matriz)
story.append(Spacer(1, 12))

# 3. Leitura Paramétrica e Recomendações
t_h3 = Table([[Paragraph("3. LEITURA PARAMÉTRICA & RECOMENDAÇÃO NAVAL", style_secao_titulo)]], colWidths=[504])
t_h3.setStyle(TableStyle([
    ('BACKGROUND', (0,0), (-1,-1), cor_primaria),
    ('TOPPADDING', (0,0), (-1,-1), 4),
    ('BOTTOMPADDING', (0,0), (-1,-1), 4),
    ('LEFTPADDING', (0,0), (-1,-1), 8),
]))
story.append(t_h3)

analise_box = [
    [Paragraph("<b>Análise Paramétrica:</b> " + dados.get("leitura_parametrica", ""), style_corpo)],
    [Paragraph("<b>Recomendação de Projeto:</b> " + dados.get("recomendacao", ""), style_corpo)],
    [Paragraph("<b>Observações e Síntese:</b> " + dados.get("observacoes", ""), style_corpo)]
]
t_analise = Table(analise_box, colWidths=[504])
t_analise.setStyle(TableStyle([
    ('BACKGROUND', (0,0), (-1,-1), colors.white),
    ('BOX', (0,0), (-1,-1), 0.5, cor_borda),
    ('GRID', (0,0), (-1,-1), 0.5, cor_borda),
    ('TOPPADDING', (0,0), (-1,-1), 6),
    ('BOTTOMPADDING', (0,0), (-1,-1), 6),
    ('LEFTPADDING', (0,0), (-1,-1), 8),
    ('RIGHTPADDING', (0,0), (-1,-1), 8),
    ('ROWBACKGROUNDS', (0,0), (-1,-1), [colors.white, cor_fundo_tabela])
]))
story.append(t_analise)

doc.build(story, canvasmaker=NumberedCanvas)
print("PDF gerado com sucesso em:", pdf_path)
