import json
from reportlab.lib.pagesizes import letter
from reportlab.lib.styles import getSampleStyleSheet, ParagraphStyle
from reportlab.lib import colors
from reportlab.platypus import SimpleDocTemplate, Paragraph, Spacer, Table, TableStyle, HRFlowable
from reportlab.pdfgen import canvas

pdf_path = "/home/magdalena/eee/alunos/caliandra/Dimensoes_Geometricas_Principais_Caliandra.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_number(num_pages)
            canvas.Canvas.showPage(self)
        canvas.Canvas.save(self)

    def draw_page_number(self, page_count):
        self.saveState()
        self.setFont("Helvetica", 8)
        self.setFillColor(colors.HexColor("#5A626B"))
        # Header
        self.drawString(54, 750, "BRANA · Escola de Arquitetura e Engenharia Naval | Estaleiro Escola Embrião")
        self.drawRightString(612 - 54, 750, "Dimensões Geométricas Principais — O RESGATE")
        self.setStrokeColor(colors.HexColor("#D3D9DC"))
        self.setLineWidth(0.5)
        self.line(54, 742, 612 - 54, 742)
        
        # Footer
        self.line(54, 45, 612 - 54, 45)
        self.drawString(54, 32, "Embarcação: O RESGATE (SAR 9.0m) · Projetista: Caliandra")
        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=60,
    bottomMargin=60
)

styles = getSampleStyleSheet()

title_style = ParagraphStyle(
    "DocTitle",
    parent=styles["Normal"],
    fontName="Helvetica-Bold",
    fontSize=16,
    leading=20,
    textColor=colors.HexColor("#1F2429"),
    spaceAfter=4
)

subtitle_style = ParagraphStyle(
    "DocSubtitle",
    parent=styles["Normal"],
    fontName="Helvetica",
    fontSize=9.5,
    leading=13,
    textColor=colors.HexColor("#5A626B"),
    spaceAfter=10
)

sec_title_style = ParagraphStyle(
    "SecTitle",
    parent=styles["Normal"],
    fontName="Helvetica-Bold",
    fontSize=10.5,
    leading=14,
    textColor=colors.HexColor("#C4262E"),
    spaceBefore=7,
    spaceAfter=3
)

p_style = ParagraphStyle(
    "Para",
    parent=styles["Normal"],
    fontName="Helvetica",
    fontSize=8.5,
    leading=11.5,
    textColor=colors.HexColor("#333333"),
    spaceAfter=4
)

th_style = ParagraphStyle(
    "TH",
    parent=styles["Normal"],
    fontName="Helvetica-Bold",
    fontSize=7.5,
    leading=9.5,
    textColor=colors.white,
    alignment=1
)

td_style = ParagraphStyle(
    "TD",
    parent=styles["Normal"],
    fontName="Helvetica",
    fontSize=7.5,
    leading=9.5,
    textColor=colors.HexColor("#1F2429"),
    alignment=1
)

td_left = ParagraphStyle(
    "TDLeft",
    parent=styles["Normal"],
    fontName="Helvetica-Bold",
    fontSize=7.5,
    leading=9.5,
    textColor=colors.HexColor("#1F2429")
)

story = []

# Title & Subtitle
story.append(Paragraph("Quadro Oficial de Dimensões Geométricas Principais", title_style))
story.append(Paragraph("<b>Embarcação:</b> O RESGATE (Lancha SAR 9.0m Deep-V) | <b>Projetista:</b> Caliandra | <b>Escola:</b> BRANA", subtitle_style))

# Intro Box
intro_p = (
    "<b>Definição de Projeto:</b> O presente documento consolida as dimensões lineares, coeficientes de forma, "
    "parâmetros hidrostáticos e dados de carena da embarcação <b>O RESGATE</b>, obtidos a partir do plano de linhas alisado "
    "com 19 balizas regulares (&Delta;X = 500 mm) e validados na condição operacional de plena carga em água salgada."
)
intro_tab = Table([[Paragraph(intro_p, p_style)]], colWidths=[504])
intro_tab.setStyle(TableStyle([
    ("BACKGROUND", (0, 0), (-1, -1), colors.HexColor("#EFF2F3")),
    ("PADDING", (0, 0), (-1, -1), 6),
    ("BOX", (0, 0), (-1, -1), 0.5, colors.HexColor("#D3D9DC")),
    ("ROUNDEDCORNERS", [4, 4, 4, 4])
]))
story.append(intro_tab)
story.append(Spacer(1, 4))

# 1. Dimensões Lineares Principais
story.append(Paragraph("1. Dimensões Lineares Principais (SI e Imperial)", sec_title_style))
story.append(HRFlowable(width="100%", thickness=0.5, color=colors.HexColor("#C4262E"), spaceAfter=4, spaceBefore=0))

dim_data = [
    [Paragraph("Parâmetro Geométrico", th_style), Paragraph("Símbolo", th_style), Paragraph("Valor Métrico", th_style), Paragraph("Valor Imperial", th_style), Paragraph("Descrição / Referência", th_style)],
    [Paragraph("Comprimento Total", td_left), Paragraph("LOA", td_style), Paragraph("<b>9,000 m</b>", td_style), Paragraph("29,53 ft", td_style), Paragraph("Da face do espelho à roda de proa", td_style)],
    [Paragraph("Comprimento na Linha d'Água", td_left), Paragraph("LWL", td_style), Paragraph("<b>7,360 m</b>", td_style), Paragraph("24,15 ft", td_style), Paragraph("Extensão molhada no calado de projeto", td_style)],
    [Paragraph("Boca Máxima Moldada / Total", td_left), Paragraph("BOA", td_style), Paragraph("<b>3,054 m</b>", td_style), Paragraph("10,02 ft", td_style), Paragraph("Largura máxima na meia-nau / popa", td_style)],
    [Paragraph("Boca na Linha d'Água", td_left), Paragraph("BWL", td_style), Paragraph("<b>2,550 m</b>", td_style), Paragraph("8,37 ft", td_style), Paragraph("Largura da carena na DWL (meia-nau)", td_style)],
    [Paragraph("Pontal na Meia-Nau", td_left), Paragraph("D", td_style), Paragraph("<b>1,118 m</b>", td_style), Paragraph("3,67 ft", td_style), Paragraph("Da quilha ao convés na Baliza 10", td_style)],
    [Paragraph("Pontal na Proa (Roda)", td_left), Paragraph("D_bow", td_style), Paragraph("<b>1,400 m</b>", td_style), Paragraph("4,59 ft", td_style), Paragraph("Tosa de proa contra embarque de ondas", td_style)],
    [Paragraph("Pontal no Espelho de Popa", td_left), Paragraph("D_stern", td_style), Paragraph("<b>1,100 m</b>", td_style), Paragraph("3,61 ft", td_style), Paragraph("Altura do espelho na Baliza 1", td_style)],
    [Paragraph("Calado de Projeto do Casco", td_left), Paragraph("Tc", td_style), Paragraph("<b>0,610 m</b>", td_style), Paragraph("2,00 ft", td_style), Paragraph("Da linha de base à DWL (5.262 kg)", td_style)],
    [Paragraph("Calado Operacional com Motores", td_left), Paragraph("T_max", td_style), Paragraph("<b>~0,850 m</b>", td_style), Paragraph("2,79 ft", td_style), Paragraph("Com rabetas 25\" abaixadas", td_style)],
    [Paragraph("Borda Livre na Meia-Nau", td_left), Paragraph("Fb", td_style), Paragraph("<b>508 mm</b>", td_style), Paragraph("20,0 in", td_style), Paragraph("Supera amplamente a ISO 12217-1", td_style)],
    [Paragraph("Borda Livre na Proa", td_left), Paragraph("Fb_bow", td_style), Paragraph("<b>790 mm</b>", td_style), Paragraph("31,1 in", td_style), Paragraph("Reserva de flutuabilidade na proa", td_style)],
    [Paragraph("Borda Livre no Espelho", td_left), Paragraph("Fb_stern", td_style), Paragraph("<b>490 mm</b>", td_style), Paragraph("19,3 in", td_style), Paragraph("Cockpit 100% autovaziante", td_style)],
    [Paragraph("Ângulo de Deadrise no Espelho", td_left), Paragraph("&beta;_stern", td_style), Paragraph("<b>15,26°</b>", td_style), Paragraph("15,26°", td_style), Paragraph("Sustentação no planeio livre", td_style)],
    [Paragraph("Ângulo de Deadrise na Proa", td_left), Paragraph("&beta;_bow", td_style), Paragraph("<b>19,54° a 24,0°</b>", td_style), Paragraph("—", td_style), Paragraph("V profundo progressivo amortecedor", td_style)],
    [Paragraph("Inclinação do Espelho (Rake)", td_left), Paragraph("&theta;_rake", td_style), Paragraph("<b>14,0°</b>", td_style), Paragraph("14,0°", td_style), Paragraph("Padrão ABYC S-30 para popa 300 HP", td_style)],
    [Paragraph("Espaçamento entre Balizas", td_left), Paragraph("&Delta;X", td_style), Paragraph("<b>500,0 mm</b>", td_style), Paragraph("19,68 in", td_style), Paragraph("18 intervalos / 19 balizas (B1 a B19)", td_style)]
]

t_dim = Table(dim_data, colWidths=[130, 45, 65, 64, 200])
t_dim.setStyle(TableStyle([
    ("BACKGROUND", (0, 0), (-1, 0), colors.HexColor("#1F2429")),
    ("GRID", (0, 0), (-1, -1), 0.5, colors.HexColor("#CBD5E1")),
    ("VALIGN", (0, 0), (-1, -1), "MIDDLE"),
    ("TOPPADDING", (0, 0), (-1, -1), 2.0),
    ("BOTTOMPADDING", (0, 0), (-1, -1), 2.0),
    ("ROWBACKGROUNDS", (0, 1), (-1, -1), [colors.HexColor("#FFFFFF"), colors.HexColor("#F8FAFC")])
]))
story.append(t_dim)
story.append(Spacer(1, 4))

# 2. Coeficientes e Relações Adimensionais
story.append(Paragraph("2. Coeficientes de Forma e Relações Adimensionais", sec_title_style))
story.append(HRFlowable(width="100%", thickness=0.5, color=colors.HexColor("#C4262E"), spaceAfter=4, spaceBefore=0))

coef_data = [
    [Paragraph("Parâmetro / Razão", th_style), Paragraph("Sigla / Fórmula", th_style), Paragraph("Valor", th_style), Paragraph("Interpretação e Faixa Típica", th_style)],
    [Paragraph("Razão Comprimento / Boca", td_left), Paragraph("LOA / BOA", td_style), Paragraph("<b>2,95</b>", td_style), Paragraph("Excelente estabilidade transversal inicial para operações SAR", td_style)],
    [Paragraph("Razão Linha d'Água / Boca Linha d'Água", td_left), Paragraph("LWL / BWL", td_style), Paragraph("<b>2,89</b>", td_style), Paragraph("Equilíbrio ideal entre arrasto e sustentação dinâmica", td_style)],
    [Paragraph("Razão Boca / Calado", td_left), Paragraph("BWL / Tc", td_style), Paragraph("<b>4,18</b>", td_style), Paragraph("Típico de embarcações de planeio de alto desempenho", td_style)],
    [Paragraph("Coeficiente de Bloco", td_left), Paragraph("Cb = &nabla; / (LWL &times; BWL &times; Tc)", td_style), Paragraph("<b>0,445</b>", td_style), Paragraph("Carena afilada Deep-V para corte eficiente de ondas", td_style)],
    [Paragraph("Coeficiente de Seção Mestra", td_left), Paragraph("Cm = Am / (BWL &times; Tc)", td_style), Paragraph("<b>0,689</b>", td_style), Paragraph("Seção transversal em V com quinas vivas bem marcadas", td_style)],
    [Paragraph("Coeficiente Prismático", td_left), Paragraph("Cp = Cb / Cm", td_style), Paragraph("<b>0,646</b>", td_style), Paragraph("Faixa ótima para planeio em velocidades acima de 30 nós", td_style)],
    [Paragraph("Razão Deslocamento-Comprimento", td_left), Paragraph("DLR = [&Delta; / 2240] / [LWL / 100]&sup3;", td_style), Paragraph("<b>371,0</b>", td_style), Paragraph("Embarcação robusta de serviço em plena carga (8 pessoas + 500L)", td_style)]
]

t_coef = Table(coef_data, colWidths=[140, 110, 45, 209])
t_coef.setStyle(TableStyle([
    ("BACKGROUND", (0, 0), (-1, 0), colors.HexColor("#1F2429")),
    ("GRID", (0, 0), (-1, -1), 0.5, colors.HexColor("#CBD5E1")),
    ("VALIGN", (0, 0), (-1, -1), "MIDDLE"),
    ("TOPPADDING", (0, 0), (-1, -1), 2.0),
    ("BOTTOMPADDING", (0, 0), (-1, -1), 2.0),
    ("ROWBACKGROUNDS", (0, 1), (-1, -1), [colors.HexColor("#FFFFFF"), colors.HexColor("#F8FAFC")])
]))
story.append(t_coef)
story.append(Spacer(1, 4))

# 3. Hidrostática, Pesos e Propulsão
story.append(Paragraph("3. Hidrostática, Deslocamento e Propulsão", sec_title_style))
story.append(HRFlowable(width="100%", thickness=0.5, color=colors.HexColor("#C4262E"), spaceAfter=4, spaceBefore=0))

hidro_p = (
    "• <b>Deslocamento de Projeto (&Delta;):</b> <b>5.262 kg</b> (~5,26 t em água salgada &rho; = 1.025 kg/m³) | <b>5.134 kg</b> em água doce.<br/>"
    "• <b>Volume Submerso (&nabla;):</b> <b>5,134 m³</b> | <b>Área de Linha d'Água (Awp):</b> ~15,9 m² | <b>Superfície Molhada (WSA):</b> ~18,7 m².<br/>"
    "• <b>Material Construtivo:</b> Casco em <b>Alumínio Naval 5083-H116</b> soldado + Cabine em <b>Compósito Sanduíche</b>.<br/>"
    "• <b>Propulsão:</b> Parelha <b>2x Motores de Popa 300 HP</b> (600 HP total a gasolina) | <b>Relação Peso/Potência:</b> 8,77 kg/HP.<br/>"
    "• <b>Performance:</b> Velocidade de Cruzeiro de <b>28 a 30 nós</b> | Velocidade Máxima de Interceptação de <b>38 a 40 nós</b>.<br/>"
    "• <b>Autonomia & Capacidade:</b> Tanques para <b>500 Litros</b> de combustível (140–150 MN de raio a 29 nós) | Lotação: <b>8 pessoas</b>."
)

hidro_tab = Table([[Paragraph(hidro_p, p_style)]], colWidths=[504])
hidro_tab.setStyle(TableStyle([
    ("BACKGROUND", (0, 0), (-1, -1), colors.HexColor("#F0FDF4")),
    ("PADDING", (0, 0), (-1, -1), 6),
    ("BOX", (0, 0), (-1, -1), 0.5, colors.HexColor("#BBF7D0")),
    ("ROUNDEDCORNERS", [4, 4, 4, 4])
]))
story.append(hidro_tab)

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