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/Estimativa_Pesos_Lotacao_Propulsao_12pax_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, "Pesos, Lotação e Propulsão (12 Pessoas) — 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=15,
    leading=19,
    textColor=colors.HexColor("#1F2429"),
    spaceAfter=4
)

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

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

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

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

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

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

story = []

# Title & Subtitle
story.append(Paragraph("Relatório Técnico: Estimativa de Pesos, Lotação Expandida e Propulsão", title_style))
story.append(Paragraph("<b>Embarcação:</b> O RESGATE (Lancha SAR 9.0m Deep-V) | <b>Lotação:</b> 12 Pessoas (4 Trip. + 8 Resg.) | <b>Projetista:</b> Caliandra", subtitle_style))

# Intro Box
intro_p = (
    "<b>Objetivo do Estudo:</b> Avaliar o impacto do aumento da capacidade operacional da lancha <b>O RESGATE</b> para "
    "<b>12 pessoas no total</b> (4 tripulantes socorristas + até 8 náufragos/resgatados). O documento detalha o novo balanço de pesos "
    "(<i>weight breakdown</i>), a verificação hidrostática de calado e borda livre, e a análise de desempenho com a propulsão recomendada de <b>600 HP (2x 300 HP)</b>."
)
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), 5),
    ("BOX", (0, 0), (-1, -1), 0.5, colors.HexColor("#D3D9DC")),
    ("ROUNDEDCORNERS", [4, 4, 4, 4])
]))
story.append(intro_tab)
story.append(Spacer(1, 3))

# 1. Balanço de Pesos (Weight Breakdown - 12 Pessoas)
story.append(Paragraph("1. Estimativa e Balanço Detalhado de Pesos (Condição 12 Pessoas)", sec_title_style))
story.append(HRFlowable(width="100%", thickness=0.5, color=colors.HexColor("#C4262E"), spaceAfter=3, spaceBefore=0))

tabela_pesos = [
    [Paragraph("Grupo de Carga / Componente", th_style), Paragraph("Especificação Técnica / Base de Cálculo", th_style), Paragraph("Peso (kg)", th_style), Paragraph("% do Total", th_style)],
    [Paragraph("1. Casco Estrutural & Chapa 5083", td_left), Paragraph("Chapas de fundo (6mm), costado (5mm), cavernas e longarinas em Alumínio 5083", td_style), Paragraph("1.850 kg", td_style), Paragraph("33,1%", td_style)],
    [Paragraph("2. Superestrutura / Cabine", td_left), Paragraph("Casario fechado em compósito sanduíche (fibra/divinycell) com vidros temperados", td_style), Paragraph("450 kg", td_style), Paragraph("8,1%", td_style)],
    [Paragraph("3. Sistema Propulsivo Completo", td_left), Paragraph("2x Motores de popa 300 HP V6 (~270 kg cada) + rabetas + baterias + direção hidráulica", td_style), Paragraph("800 kg", td_style), Paragraph("14,3%", td_style)],
    [Paragraph("4. Combustível Operacional (100%)", td_left), Paragraph("Tanque principal cheio: 500 Litros de gasolina (densidade 0,75 kg/L)", td_style), Paragraph("375 kg", td_style), Paragraph("6,7%", td_style)],
    [Paragraph("5. Tripulação Operacional (4 socorristas)", td_left), Paragraph("4 tripulantes equipados (traje SAR, EPI, capacetes) &times; 85 kg/pessoa", td_style), Paragraph("340 kg", td_style), Paragraph("6,1%", td_style)],
    [Paragraph("6. Resgatados / Náufragos (8 pessoas)", td_left), Paragraph("Capacidade de resgate expandida: 8 pessoas &times; 80 kg/pessoa (padrão ISO/IMO)", td_style), Paragraph("640 kg", td_style), Paragraph("11,5%", td_style)],
    [Paragraph("7. Equipamentos Médicos, SAR e Rádio", td_left), Paragraph("2x macas rígidas, kits APH, cilindros O2, radar, rádios VHF/HF/AIS, faróis, salvatagem", td_style), Paragraph("550 kg", td_style), Paragraph("9,9%", td_style)],
    [Paragraph("8. Margem de Projeto e Incertezas", td_left), Paragraph("Reserva técnica regulamentar para tintas, soldas e contingências de projeto (~10%)", td_style), Paragraph("577 kg", td_style), Paragraph("10,3%", td_style)],
    [Paragraph("<b>DESLOCAMENTO TOTAL DE PLENA CARGA</b>", td_left), Paragraph("<b>12 Pessoas a Bordo + Tanque 100% + Equipamentos Completos</b>", td_style), Paragraph("<b>5.582 kg</b>", td_style), Paragraph("<b>100,0%</b>", td_style)]
]

t_peso = Table(tabela_pesos, colWidths=[130, 230, 74, 70])
t_peso.setStyle(TableStyle([
    ("BACKGROUND", (0, 0), (-1, 0), colors.HexColor("#1F2429")),
    ("BACKGROUND", (0, -1), (-1, -1), colors.HexColor("#FEF3C7")),
    ("GRID", (0, 0), (-1, -1), 0.5, colors.HexColor("#CBD5E1")),
    ("VALIGN", (0, 0), (-1, -1), "MIDDLE"),
    ("TOPPADDING", (0, 0), (-1, -1), 1.8),
    ("BOTTOMPADDING", (0, 0), (-1, -1), 1.8),
]))
story.append(t_peso)
story.append(Spacer(1, 4))

# 2. Arranjo e Lotação de Convés (12 Pessoas)
story.append(Paragraph("2. Distribuição Espacial e Acomodação a Bordo (Arranjo de 12 Pessoas)", sec_title_style))
story.append(HRFlowable(width="100%", thickness=0.5, color=colors.HexColor("#C4262E"), spaceAfter=3, spaceBefore=0))

arr_p = (
    "• <b>Cabine Fechada de Comando (4 Tripulantes + 2 Resgatados em Maca):</b><br/>"
    "  - 4 assentos individuais com atenuação de impacto (<i>shock-mitigating</i>) para Comandante, Navegador e 2 Socorristas.<br/>"
    "  - Corredor central com trilhos no piso para fixação rápida de até <b>2 macas rígidas de trauma</b> com atendimento direto de APH.<br/>"
    "• <b>Praça de Resgate / Cockpit de Popa (6 a 8 Resgatados):</b><br/>"
    "  - Área livre de convés de mais de <b>7,5 m²</b>, equipada com bancos laterais rebatíveis nos costados.<br/>"
    "  - Piso 100% plano, antiderrapante e autovaziante, permitindo trânsito seguro mesmo com mar agitado.<br/>"
    "• <b>Flutuador Periférico (D-Collar):</b> Fornece reserva de flutuabilidade insubmergível de mais de 3.000 kg adicionais."
)
story.append(Paragraph(arr_p, p_style))
story.append(Spacer(1, 3))

# 3. Verificação Hidrostática e de Borda Livre
story.append(Paragraph("3. Verificação Hidrostática: Calado e Reserva de Borda Livre", sec_title_style))
story.append(HRFlowable(width="100%", thickness=0.5, color=colors.HexColor("#C4262E"), spaceAfter=3, spaceBefore=0))

hidro_comp = [
    [Paragraph("Condição de Operação", th_style), Paragraph("Lotação", th_style), Paragraph("Deslocamento", th_style), Paragraph("Calado (Tc)", th_style), Paragraph("Borda Livre Meia-Nau", th_style), Paragraph("Status Regulamentar", th_style)],
    [Paragraph("1. Prontidão Operacional", td_left), Paragraph("4 tripulantes", td_style), Paragraph("4.362 kg", td_style), Paragraph("0,55 m", td_style), Paragraph("568 mm", td_style), Paragraph("Excelente Reserva", td_style)],
    [Paragraph("2. Missão Padrão SAR", td_left), Paragraph("8 pessoas (4+4)", td_style), Paragraph("5.262 kg", td_style), Paragraph("0,61 m", td_style), Paragraph("508 mm", td_style), Paragraph("Projeto Nominal", td_style)],
    [Paragraph("<b>3. Resgate Pleno Expandido</b>", td_left), Paragraph("<b>12 pessoas (4+8)</b>", td_style), Paragraph("<b>5.582 kg</b>", td_style), Paragraph("<b>0,63 m</b>", td_style), Paragraph("<b>488 mm</b>", td_style), Paragraph("<b>100% Conforme ISO 12217</b>", td_style)],
    [Paragraph("4. Sobrecarga Extrema", td_left), Paragraph("15 pessoas", td_style), Paragraph("5.890 kg", td_style), Paragraph("0,65 m", td_style), Paragraph("468 mm", td_style), Paragraph("Margem Segura (>2x mín.)", td_style)]
]

t_hidro = Table(hidro_comp, colWidths=[110, 70, 74, 60, 95, 95])
t_hidro.setStyle(TableStyle([
    ("BACKGROUND", (0, 0), (-1, 0), colors.HexColor("#1F2429")),
    ("BACKGROUND", (0, 3), (-1, 3), colors.HexColor("#E0F2FE")),
    ("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),
]))
story.append(t_hidro)
story.append(Spacer(1, 4))

# 4. Dimensionamento e Recomendação de Propulsão
story.append(Paragraph("4. Análise de Desempenho e Recomendação da Propulsão (600 HP)", sec_title_style))
story.append(HRFlowable(width="100%", thickness=0.5, color=colors.HexColor("#C4262E"), spaceAfter=3, spaceBefore=0))

prop_p = (
    "• <b>Configuração Recomendada:</b> Parelha <b>2x Motores de Popa de 300 HP V6 a Gasolina (600 HP total)</b>.<br/>"
    "• <b>Relação Peso / Potência com 12 Pessoas:</b> 5.582 kg / 600 HP = <b>9,30 kg/HP</b>.<br/>"
    "  <i>(Em arquitetura naval, lanchas de planeio com relação abaixo de 10 kg/HP sobem em planeio com extrema facilidade, mesmo em mar agitado).</i><br/>"
    "• <b>Velocidade de Cruzeiro Prevista:</b> <b>28 a 30 nós</b> em regime econômico (~4.200 RPM, consumo conjunto de ~95 L/h).<br/>"
    "• <b>Velocidade Máxima de Interceptação:</b> <b>38 a 40 nós</b> em aceleração máxima (WOT @ 5.800 RPM).<br/>"
    "• <b>Autonomia com 500 L:</b> <b>~145 Milhas Náuticas</b> em velocidade de cruzeiro com 20% de reserva regulamentar.<br/>"
    "• <b>Redundância de Segurança SAR:</b> Operação mono-motor de retorno seguro (<i>take-me-home</i>) a 10–12 nós em caso de avaria em um dos motores."
)

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

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