#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""
Gera o PDF de Estudo de Similares Completo e Aprofundado com identidade visual Brana / EEE.
"""
import json
import os
from reportlab.lib.pagesizes import A4
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.lib.units import cm
from reportlab.pdfgen import canvas

class NumberedCanvas(canvas.Canvas):
    def __init__(self, *args, **kwargs):
        super(NumberedCanvas, self).__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_decorations(num_pages)
            super(NumberedCanvas, self).showPage()
        super(NumberedCanvas, self).save()

    def draw_page_decorations(self, page_count):
        self.saveState()
        
        # Header (páginas > 1)
        if self._pageNumber > 1:
            self.setFont("Helvetica-Bold", 8)
            self.setFillColor(colors.HexColor("#0B2545"))
            self.drawString(40, 804, "BRANA | ESCOLA DE ENGENHARIA NAVAL & ESTALEIRO ESCOLA EMBRIÃO")
            self.setFont("Helvetica", 8)
            self.setFillColor(colors.HexColor("#64748B"))
            self.drawRightString(555, 804, "Saveiro Costeiro Tradicional 7,00m • Estudo de Similares Completo")
            self.setStrokeColor(colors.HexColor("#CBD5E1"))
            self.setLineWidth(0.5)
            self.line(40, 796, 555, 796)

        # Footer (todas as páginas)
        self.setFont("Helvetica", 8)
        self.setFillColor(colors.HexColor("#64748B"))
        self.drawString(40, 32, "Aluno: Antônio Manoel Costa (Grupo 4) • Orientação: Profa. Magdalena (Mada) — Brana/EEE")
        page_text = f"Página {self._pageNumber} de {page_count}"
        self.drawRightString(555, 32, page_text)
        self.setStrokeColor(colors.HexColor("#CBD5E1"))
        self.setLineWidth(0.5)
        self.line(40, 44, 555, 44)
        
        self.restoreState()

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

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

    styles = getSampleStyleSheet()

    # Cores Brana
    AZUL_ESCURO = colors.HexColor("#0B2545")
    AZUL_MEDIO = colors.HexColor("#134074")
    DOURADO = colors.HexColor("#C59B27")
    CINZA_FUNDO = colors.HexColor("#F8FAFC")
    CINZA_LINHA = colors.HexColor("#CBD5E1")
    CINZA_TEXTO = colors.HexColor("#1E293B")
    DESTAQUE_BG = colors.HexColor("#FEF9C3") # Amarelo suave

    title_style = ParagraphStyle(
        'DocTitle',
        parent=styles['Normal'],
        fontName='Helvetica-Bold',
        fontSize=15,
        leading=19,
        textColor=AZUL_ESCURO,
        alignment=1,
        spaceAfter=3
    )

    subtitle_style = ParagraphStyle(
        'DocSubtitle',
        parent=styles['Normal'],
        fontName='Helvetica-Bold',
        fontSize=9.5,
        leading=13,
        textColor=DOURADO,
        alignment=1,
        spaceAfter=10
    )

    h1_style = ParagraphStyle(
        'Heading1_Custom',
        parent=styles['Normal'],
        fontName='Helvetica-Bold',
        fontSize=10.5,
        leading=14,
        textColor=AZUL_ESCURO,
        spaceBefore=8,
        spaceAfter=3,
        keepWithNext=True
    )

    h2_style = ParagraphStyle(
        'Heading2_Custom',
        parent=styles['Normal'],
        fontName='Helvetica-Bold',
        fontSize=8.5,
        leading=11,
        textColor=AZUL_MEDIO,
        spaceBefore=5,
        spaceAfter=2,
        keepWithNext=True
    )

    body_style = ParagraphStyle(
        'Body_Custom',
        parent=styles['Normal'],
        fontName='Helvetica',
        fontSize=8,
        leading=11,
        textColor=CINZA_TEXTO,
        alignment=4,
        spaceAfter=3
    )

    bullet_style = ParagraphStyle(
        'Bullet_Custom',
        parent=body_style,
        leftIndent=10,
        firstLineIndent=-6,
        spaceAfter=2
    )

    cell_bold = ParagraphStyle(
        'CellBold',
        parent=styles['Normal'],
        fontName='Helvetica-Bold',
        fontSize=7,
        leading=8.5,
        textColor=AZUL_ESCURO
    )

    cell_norm = ParagraphStyle(
        'CellNorm',
        parent=styles['Normal'],
        fontName='Helvetica',
        fontSize=7,
        leading=8.5,
        textColor=CINZA_TEXTO
    )

    cell_proj = ParagraphStyle(
        'CellProj',
        parent=styles['Normal'],
        fontName='Helvetica-Bold',
        fontSize=7,
        leading=8.5,
        textColor=colors.HexColor("#854D0E") # Tom âmbar escuro legível
    )

    story = []

    # Cabeçalho / Título
    story.append(Paragraph("ESTUDO DE SIMILARES & ANÁLISE PARAMÉTRICA NAVAL COMPLETA", title_style))
    story.append(Paragraph("METODOLOGIA BRANA / EEE • DIMENSIONAMENTO DO SAVEIRO COSTEIRO TRADICIONAL 7,00 M", subtitle_style))
    story.append(HRFlowable(width="100%", thickness=1.5, color=DOURADO, spaceAfter=6))

    # Metadados do Projeto
    meta_data = [
        [
            Paragraph("<b>Projetista:</b> Antônio Manoel Costa", cell_bold),
            Paragraph("<b>Grupo:</b> Grupo 4 (EEE / Brana)", cell_bold),
            Paragraph("<b>Data:</b> Setembro / 2026", cell_bold)
        ],
        [
            Paragraph("<b>Embarcação Pretendida:</b> Saveiro Costeiro Baiano Tradicional 7,00 m", cell_bold),
            Paragraph("<b>Propulsão:</b> Vela de Içar + Popa 15 HP", cell_bold),
            Paragraph("<b>Orçamento:</b> R$ 45.000,00 (Teto)", cell_bold)
        ]
    ]
    meta_table = Table(meta_data, colWidths=[180, 175, 160])
    meta_table.setStyle(TableStyle([
        ('BACKGROUND', (0,0), (-1,-1), CINZA_FUNDO),
        ('BOX', (0,0), (-1,-1), 0.5, CINZA_LINHA),
        ('INNERGRID', (0,0), (-1,-1), 0.5, CINZA_LINHA),
        ('PADDING', (0,0), (-1,-1), 3.5),
        ('VALIGN', (0,0), (-1,-1), 'MIDDLE'),
    ]))
    story.append(meta_table)
    story.append(Spacer(1, 4))

    # Resumo do Caso de Uso & Critérios
    story.append(Paragraph("1. Caso de Uso & Critérios de Seleção dos Similares", h1_style))
    story.append(Paragraph(f"<b>Caso de Uso Sintético:</b> {data.get('caso_de_uso_resumo', '')}", body_style))
    story.append(Paragraph(f"<b>Critérios de Seleção:</b> {data.get('criterios_selecao', '')}", body_style))
    story.append(Spacer(1, 4))

    # Tabela Comparativa Principal Completa
    story.append(Paragraph("2. Tabela Comparativa Completa de Parâmetros Dimensionais e Hidrodinâmicos", h1_style))

    headers = [
        Paragraph("<b>Parâmetro / Grandeza</b>", cell_bold),
        Paragraph("<b>Projeto Novo<br/>(Saveiro 7,0m)</b>", cell_proj),
        Paragraph("<b>Sombra da Lua<br/>(1925 - BA)</b>", cell_bold),
        Paragraph("<b>Vendaval II<br/>(1947 - BA)</b>", cell_bold),
        Paragraph("<b>Family Cat 23<br/>(1978 - CAN)</b>", cell_bold),
        Paragraph("<b>22 Cruising Cat<br/>(2006 - USA)</b>", cell_bold),
        Paragraph("<b>Marshall 22<br/>(1965 - USA)</b>", cell_bold),
        Paragraph("<b>Sanderling 18<br/>(1962 - USA)</b>", cell_bold)
    ]

    rows = [
        [Paragraph("Comprimento Total (LOA)", cell_norm), Paragraph("<b>7,00 m</b>", cell_proj), Paragraph("12,50 m", cell_norm), Paragraph("14,00 m", cell_norm), Paragraph("7,01 m", cell_norm), Paragraph("6,81 m", cell_norm), Paragraph("6,76 m", cell_norm), Paragraph("5,54 m", cell_norm)],
        [Paragraph("Comprimento Linha D'água (LWL)", cell_norm), Paragraph("<b>6,40 m</b>", cell_proj), Paragraph("~11,40 m", cell_norm), Paragraph("~12,80 m", cell_norm), Paragraph("6,32 m", cell_norm), Paragraph("6,45 m", cell_norm), Paragraph("6,50 m", cell_norm), Paragraph("5,33 m", cell_norm)],
        [Paragraph("Boca Máxima (BOA)", cell_norm), Paragraph("<b>2,72 m</b>", cell_proj), Paragraph("4,00 m", cell_norm), Paragraph("3,70 m", cell_norm), Paragraph("3,05 m", cell_norm), Paragraph("3,15 m", cell_norm), Paragraph("3,10 m", cell_norm), Paragraph("2,59 m", cell_norm)],
        [Paragraph("Pontal Moldado (D)", cell_norm), Paragraph("<b>1,05 m</b>", cell_proj), Paragraph("1,65 m", cell_norm), Paragraph("1,70 m", cell_norm), Paragraph("1,15 m", cell_norm), Paragraph("1,12 m", cell_norm), Paragraph("1,05 m", cell_norm), Paragraph("0,85 m", cell_norm)],
        [Paragraph("Calado Mín. / Máx. (T)", cell_norm), Paragraph("<b>0,35 / 1,25 m</b>", cell_proj), Paragraph("0,60 / 1,60 m", cell_norm), Paragraph("0,65 / 1,80 m", cell_norm), Paragraph("0,69 / 1,83 m", cell_norm), Paragraph("0,51 / 1,22 m", cell_norm), Paragraph("0,61 / 1,58 m", cell_norm), Paragraph("0,48 / 1,32 m", cell_norm)],
        [Paragraph("Borda Livre Proa (FF)", cell_norm), Paragraph("<b>0,95 m</b>", cell_proj), Paragraph("1,40 m", cell_norm), Paragraph("1,45 m", cell_norm), Paragraph("0,98 m", cell_norm), Paragraph("0,95 m", cell_norm), Paragraph("0,91 m", cell_norm), Paragraph("0,76 m", cell_norm)],
        [Paragraph("Borda Livre Meia-Nau (FM)", cell_norm), Paragraph("<b>0,70 m</b>", cell_proj), Paragraph("1,05 m", cell_norm), Paragraph("1,10 m", cell_norm), Paragraph("0,72 m", cell_norm), Paragraph("0,70 m", cell_norm), Paragraph("0,70 m", cell_norm), Paragraph("0,58 m", cell_norm)],
        [Paragraph("Largura Espelho Popa", cell_norm), Paragraph("<b>1,65 m</b>", cell_proj), Paragraph("~2,30 m", cell_norm), Paragraph("~2,20 m", cell_norm), Paragraph("1,75 m", cell_norm), Paragraph("1,85 m", cell_norm), Paragraph("1,85 m", cell_norm), Paragraph("1,50 m", cell_norm)],
        [Paragraph("Deslocamento Total (Δ)", cell_norm), Paragraph("<b>1.850 kg</b>", cell_proj), Paragraph("~11.500 kg", cell_norm), Paragraph("~14.000 kg", cell_norm), Paragraph("2.722 kg", cell_norm), Paragraph("2.495 kg", cell_norm), Paragraph("2.567 kg", cell_norm), Paragraph("998 kg", cell_norm)],
        [Paragraph("Área Vélica Total (SA)", cell_norm), Paragraph("<b>28,0 m²</b>", cell_proj), Paragraph("~75,0 m²", cell_norm), Paragraph("98,0 m²", cell_norm), Paragraph("38,5 m²", cell_norm), Paragraph("37,2 m²", cell_norm), Paragraph("36,1 m²", cell_norm), Paragraph("23,5 m²", cell_norm)],
        [Paragraph("Potência Motor Auxiliar", cell_norm), Paragraph("<b>15 HP</b>", cell_proj), Paragraph("40 HP", cell_norm), Paragraph("45 HP", cell_norm), Paragraph("10 HP", cell_norm), Paragraph("20 HP", cell_norm), Paragraph("21 HP", cell_norm), Paragraph("10 HP", cell_norm)],
        [Paragraph("Velocidade Cruzeiro / Máx", cell_norm), Paragraph("<b>5,5 / 6,6 kn</b>", cell_proj), Paragraph("5,5 / 7,5 kn", cell_norm), Paragraph("6,0 / 8,0 kn", cell_norm), Paragraph("5,2 / 6,1 kn", cell_norm), Paragraph("5,2 / 6,1 kn", cell_norm), Paragraph("5,4 / 6,2 kn", cell_norm), Paragraph("4,8 / 5,6 kn", cell_norm)],
        [Paragraph("Razão Boca / Compr. (B/L)", cell_bold), Paragraph("<b>0,39</b>", cell_proj), Paragraph("0,32", cell_bold), Paragraph("0,26", cell_bold), Paragraph("0,44", cell_bold), Paragraph("0,46", cell_bold), Paragraph("0,46", cell_bold), Paragraph("0,47", cell_bold)],
        [Paragraph("Razão Desloc./Compr. (DLR)", cell_bold), Paragraph("<b>~208</b>", cell_proj), Paragraph("~217", cell_bold), Paragraph("~186", cell_bold), Paragraph("299,8", cell_bold), Paragraph("258,7", cell_bold), Paragraph("260,4", cell_bold), Paragraph("183,3", cell_bold)],
        [Paragraph("Deslocamento / Potência", cell_bold), Paragraph("<b>123,3 kg/HP</b>", cell_proj), Paragraph("287,5 kg/HP", cell_bold), Paragraph("311,1 kg/HP", cell_bold), Paragraph("272,2 kg/HP", cell_bold), Paragraph("124,8 kg/HP", cell_bold), Paragraph("122,2 kg/HP", cell_bold), Paragraph("99,8 kg/HP", cell_bold)]
    ]

    t_data = [headers] + rows
    comp_table = Table(t_data, colWidths=[108, 62, 57, 57, 57, 57, 57, 57])
    comp_table.setStyle(TableStyle([
        ('BACKGROUND', (0,0), (-1,0), AZUL_ESCURO),
        ('BACKGROUND', (1,1), (1,-1), DESTAQUE_BG), # Destaque coluna do projeto 7,00m
        ('ALIGN', (0,0), (-1,-1), 'CENTER'),
        ('ALIGN', (0,0), (0,-1), 'LEFT'),
        ('VALIGN', (0,0), (-1,-1), 'MIDDLE'),
        ('GRID', (0,0), (-1,-1), 0.5, CINZA_LINHA),
        ('LINEBELOW', (0,0), (-1,0), 1.2, DOURADO),
        ('PADDING', (0,0), (-1,-1), 2.5),
    ]))
    story.append(comp_table)
    story.append(Spacer(1, 6))

    # ==================== PÁGINA 2 ====================
    story.append(PageBreak())

    # Análise Paramétrica Aprofundada
    story.append(Paragraph("3. Leitura Paramétrica do Arquiteto Naval & Justificativas Técnicas", h1_style))
    story.append(Paragraph(data.get("leitura_parametrica", ""), body_style))
    story.append(Spacer(1, 4))

    story.append(Paragraph("<b>Detalhamento dos Coeficientes e Parâmetros Hidrodinâmicos:</b>", h2_style))
    story.append(Paragraph("<b>• Razão Deslocamento/Comprimento (DLR = 208):</b> Calculada pela fórmula $DLR = \\frac{\\Delta / 1016}{(L_{WL} / 0,3048)^3} \\times 10^4$. Um DLR de ~208 enquadra a embarcação na categoria de <i>deslocamento moderado</i>, perfeita para garantir conforto de marcha e caturro suave nas ondas de mar aberto costeiro entre a Barra e o Rio Vermelho, sem o peso excessivo dos saveiros cargueiros centenários.", bullet_style))
    story.append(Paragraph("<b>• Razão Deslocamento / Potência (123,3 kg/HP):</b> Com deslocamento de 1.850 kg e motor de 15 HP, a relação de 123 kg/HP garante empuxo de sobra para vencer a correnteza de maré na entrada da Baía de Todos-os-Santos e manobras rápidas de atracação em dias de rajada.", bullet_style))
    story.append(Paragraph("<b>• Geometria do Espelho de Popa (1,65 m de largura):</b> O espelho de popa com 60% da boca máxima assegura alta estabilidade transversal a ré, sustentando a tripulação no cockpit sem afundamento excessivo de popa e proporcionando travamento rígido para o suporte do motor e fixação do toldo amplo.", bullet_style))
    story.append(Paragraph("<b>• Borda Livre e Reserva de Flutuabilidade:</b> A borda livre de 0,95 m na proa (FF) com tosamento tradicional protege o convés aberto contra o embarque de respingos e ondas na arrebentação da Z1, enquanto a borda livre de 0,70 m a meia-nau garante profundidade segura para encosto dos passageiros.", bullet_style))
    story.append(Paragraph("<b>• Velocidade de Cruzeiro e Velocidade Máxima de Casco:</b> A velocidade limite por onda é $V_k = 2,43 \\times \\sqrt{6,40} \\approx 6,15\\text{ a }6,60$ nós. O saveiro navegará confortavelmente em cruzeiro a 5,5 nós sob ventos alísios de 10 a 16 nós.", bullet_style))

    story.append(Spacer(1, 4))
    story.append(Paragraph("4. Recomendações e Diretrizes para o Plano de Linhas 3D", h1_style))
    story.append(Paragraph(data.get("recomendacao", ""), body_style))
    story.append(Spacer(1, 4))

    story.append(Paragraph("5. Fontes Consultadas & Auditoria Bibliográfica", h1_style))
    fontes_texto = """
    • <b>IPHAN (2010):</b> Processo de Tombamento dos Saveiros da Bahia (Ata da 66ª Reunião do Conselho Consultivo).<br/>
    • <b>Mar Bahia (2024):</b> A Alma dos Saveiros: a volta do Sombra da Lua à navegação cultural na BTS.<br/>
    • <b>Bahia Já & Viva Saveiro (2008):</b> Recuperação e salvaguarda do Saveiro Vendaval II.<br/>
    • <b>Sailboatdata Database:</b> Registros oficiais de Family Cat 23 (William Garden), 22 Cruising Catboat (Arey's Pond), Marshall 22 Cat e Sanderling 18.<br/>
    • <b>Lev Smarcevski (1996):</b> Graminho, a Alma do Saveiro — Edições Culturais Odebrecht.<br/>
    • <b>Gerr, Dave (1999):</b> The Nature of Boats — Relações de DLR, calado e estabilidade de forma para barcos clássicos.
    """
    story.append(Paragraph(fontes_texto, body_style))

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

if __name__ == "__main__":
    json_file = "/home/magdalena/eee/alunos/antonio-manoel-costa/dados_similares.json"
    pdf_file = "/home/magdalena/eee/alunos/antonio-manoel-costa/Estudo_de_Similar_Antonio_Manoel_Costa.pdf"
    gerar_pdf(json_file, pdf_file)
