import os
from reportlab.lib.pagesizes import letter, A4
from reportlab.platypus import (
    SimpleDocTemplate, Paragraph, Spacer, Table, TableStyle, Image, PageBreak, KeepTogether, HRFlowable
)
from reportlab.lib.styles import getSampleStyleSheet, ParagraphStyle
from reportlab.lib import colors
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()
        self.setFont("Helvetica", 8)
        self.setFillColor(colors.HexColor("#555555"))
        
        # Header (pages > 1)
        if self._pageNumber > 1:
            self.drawString(54, 800, "BRANA / EEE - Memorial Descritivo de Projeto Naval")
            self.drawRightString(541, 800, "Saveiro Tradicional 12m - Izana Sacramento")
            self.setStrokeColor(colors.HexColor("#0f3b5f"))
            self.setLineWidth(0.5)
            self.line(54, 792, 541, 792)
        
        # Footer
        self.setStrokeColor(colors.HexColor("#cccccc"))
        self.setLineWidth(0.5)
        self.line(54, 45, 541, 45)
        
        self.drawString(54, 32, "Estaleiro Escola Embrião (EEE) & Escola Brana")
        self.drawRightString(541, 32, f"Página {self._pageNumber} de {page_count}")
        self.restoreState()

def build_pdf():
    pdf_path = "/home/magdalena/eee/alunos/izana-sacramento/Memorial_Descritivo_Saveiro_12m_Izana_Sacramento.pdf"
    doc = SimpleDocTemplate(
        pdf_path,
        pagesize=A4,
        leftMargin=54,
        rightMargin=54,
        topMargin=54,
        bottomMargin=54
    )
    
    styles = getSampleStyleSheet()
    
    title_style = ParagraphStyle(
        'DocTitle',
        parent=styles['Normal'],
        fontName='Helvetica-Bold',
        fontSize=20,
        leading=24,
        textColor=colors.HexColor("#0a2540"),
        alignment=1, # Center
        spaceAfter=10
    )
    
    subtitle_style = ParagraphStyle(
        'DocSubTitle',
        parent=styles['Normal'],
        fontName='Helvetica',
        fontSize=12,
        leading=16,
        textColor=colors.HexColor("#2a5b84"),
        alignment=1,
        spaceAfter=20
    )
    
    h1_style = ParagraphStyle(
        'H1',
        parent=styles['Normal'],
        fontName='Helvetica-Bold',
        fontSize=13,
        leading=17,
        textColor=colors.HexColor("#0f3b5f"),
        spaceBefore=14,
        spaceAfter=6,
        keepWithNext=True
    )
    
    body_style = ParagraphStyle(
        'Body',
        parent=styles['Normal'],
        fontName='Helvetica',
        fontSize=9.5,
        leading=13.5,
        textColor=colors.HexColor("#222222"),
        spaceAfter=6
    )
    
    bullet_style = ParagraphStyle(
        'Bullet',
        parent=styles['Normal'],
        fontName='Helvetica',
        fontSize=9,
        leading=13,
        textColor=colors.HexColor("#333333"),
        leftIndent=12,
        firstLineIndent=-8,
        spaceAfter=4
    )
    
    story = []
    
    # Capa / Cabeçalho
    story.append(Paragraph("MEMORIAL DESCRITIVO E CONCEITUAL DE PROJETO", title_style))
    story.append(Paragraph("Saveiro Tradicional da Bahia de 12 Metros (39,4 pés)<br/><b>Passeio Costeiro, Turismo Cultural e Regatas Tradicionais</b>", subtitle_style))
    story.append(HRFlowable(width="100%", thickness=1.5, color=colors.HexColor("#0f3b5f"), spaceAfter=12))
    
    # Metadados
    meta_data = [
        [Paragraph("<b>Projetista:</b> Izana Sacramento", body_style), Paragraph("<b>Data:</b> Setembro / 2026", body_style)],
        [Paragraph("<b>Instituição:</b> Brana / Estaleiro Escola Embrião (EEE)", body_style), Paragraph("<b>Local:</b> Salvador / Baía de Todos-os-Santos", body_style)],
        [Paragraph("<b>Orientação:</b> Profª. Magdalena (Mada)", body_style), Paragraph("<b>Status:</b> Projeto Conceitual / Linhas Preliminares", body_style)],
    ]
    meta_table = Table(meta_data, colWidths=[240, 240])
    meta_table.setStyle(TableStyle([
        ('BACKGROUND', (0,0), (-1,-1), colors.HexColor("#f4f7f9")),
        ('PADDING', (0,0), (-1,-1), 6),
        ('BOX', (0,0), (-1,-1), 0.5, colors.HexColor("#d0dbe5")),
        ('VALIGN', (0,0), (-1,-1), 'MIDDLE'),
    ]))
    story.append(meta_table)
    story.append(Spacer(1, 10))
    
    # 1. Caracterização da Área de Navegação
    story.append(Paragraph("1. Caracterização da Área de Navegação e Rota Operacional", h1_style))
    story.append(Paragraph("A embarcação foi concebida para operar na <b>Baía de Todos-os-Santos (BTS)</b> e na bacia hidrográfica do <b>Rio Jaguaripe</b>, conectando a capital Salvador à histórica cidade de Jaguaripe. A rota média totaliza entre <b>28 e 35 milhas náuticas</b>, combinando dois regimes operacionais distintos:", body_style))
    story.append(Paragraph("• <b>Trecho 1 (Travessia Salvador ↔ Barra de Itaparica/Ponta do Garcez):</b> Águas abertas da BTS sujeitas a ventos alísios frescos (12 a 20 nós) de E/SE e ondas curtas (0,6 a 1,2 m), demandando excelente estabilidade e proa com flaring para manter o convés seco.", bullet_style))
    story.append(Paragraph("• <b>Trecho 2 (Estuário e Calha do Rio Jaguaripe até a Cidade de Jaguaripe):</b> Águas calmas e abrigadas com forte influência de correntes de maré e presença de baixios arenosos/lodosos, exigindo calado restrito e excelente manobrabilidade.", bullet_style))
    
    # 2. Dimensões Principais Preliminares
    story.append(Paragraph("2. Dimensões Principais e Coeficientes Hidrostáticos", h1_style))
    dim_data = [
        ["Parâmetro de Projeto", "Símbolo", "Valor Adotado", "Justificativa / Função Naval"],
        ["Comprimento Fora a Fora", "LOA", "12,00 m (39,4 ft)", "Porte tradicional com amplo espaço para convés"],
        ["Comprimento na Linha d'Água", "LWL", "10,80 m", "Proa lançada e popa de painel tradicional"],
        ["Boca Moldada Máxima", "B", "3,60 m", "Relação L/B = 3,33 (estabilidade de forma e conforto)"],
        ["Pontal Moldado", "D", "1,70 m", "Reserva de borda livre e volume interno"],
        ["Calado de Projeto", "T", "1,05 m", "Acesso estuarino a Jaguaripe sem risco de encalhe"],
        ["Borda Livre a Meia-Nau", "FL", "0,70 m", "Segurança contra embarque de mar picado"],
        ["Deslocamento Total Carregado", "Δ", "7,70 t", "Água salgada (ρ = 1,025 t/m³), V = 7,51 m³"],
        ["Coeficiente de Bloco", "CB", "0,47", "Casco afilado com baixo arrasto para regatas"],
        ["Coeficiente Prismático", "CP", "0,63", "Distribuição longitudinal ideal para Fn ≈ 0,35 - 0,40"]
    ]
    dim_table = Table(dim_data, colWidths=[130, 45, 95, 215])
    dim_table.setStyle(TableStyle([
        ('BACKGROUND', (0,0), (-1,0), colors.HexColor("#0f3b5f")),
        ('TEXTCOLOR', (0,0), (-1,0), colors.white),
        ('FONTNAME', (0,0), (-1,0), 'Helvetica-Bold'),
        ('FONTSIZE', (0,0), (-1,-1), 8),
        ('PADDING', (0,0), (-1,-1), 4),
        ('GRID', (0,0), (-1,-1), 0.5, colors.HexColor("#cccccc")),
        ('ROWBACKGROUNDS', (0,1), (-1,-1), [colors.white, colors.HexColor("#f9fbfd")]),
        ('ALIGN', (1,0), (2,-1), 'CENTER'),
    ]))
    story.append(dim_table)
    story.append(Spacer(1, 10))
    
    # 3. Imagem do Perfil e Linhas
    story.append(Paragraph("3. Plano de Linhas e Geometria do Casco", h1_style))
    img_path = "/home/magdalena/eee/alunos/izana-sacramento/perfil_e_linhas_saveiro.png"
    if os.path.exists(img_path):
        story.append(Image(img_path, width=480, height=260))
        story.append(Spacer(1, 8))
    
    story.append(PageBreak())
    
    # 4. Método Construtivo em Madeira Tradicional
    story.append(Paragraph("4. Método Construtivo Tradicional Calafetado", h1_style))
    story.append(Paragraph("A construção segue rigorosamente as boas práticas da carpintaria naval artesanal baiana preservadas pelo Estaleiro Escola Embrião (EEE):", body_style))
    story.append(Paragraph("• <b>Espinha Dorsal (Quilha, Roda de Proa e Cadaste):</b> Executada em madeira nobre de alta densidade (Massaranduba ou Ipê/Pau d'Arco), quilha com seção transversal de 15 x 20 cm e perfil corrido com caimento (drag) para a ré.", bullet_style))
    story.append(Paragraph("• <b>Cavername:</b> Cavernas duplas serradas em madeira de lei (Pequiá/Sucupira), espaçadas a cada 32 cm de centro a centro, travadas por sobrequilhas e curvas de convés.", bullet_style))
    story.append(Paragraph("• <b>Costado e Fundo (Tabuado):</b> Tábuas longitudinais contínuas de 28 mm de espessura (Louro-Canela ou Tatajuba), fixadas com cravos galvanizados a fogo e cavilhas de madeira de lei.", bullet_style))
    story.append(Paragraph("• <b>Calafeto e Vedação:</b> Fendas chanfradas preenchidas com estopa de algodão e linho de primeira prensa, seladas com breu náutico fervido e composto elástico poliuretano marítimo.", bullet_style))
    
    # 5. Distribuição Preliminar de Pesos e Balanço
    story.append(Paragraph("5. Distribuição de Pesos (Condição de Passeio - 10 Ocupantes)", h1_style))
    pesos_data = [
        ["Item / Componente", "Massa (kg)", "VCG (m)", "LCG (% LWL)", "Observação"],
        ["Casco em Madeira (Estrutura Completa)", "3.600", "0,90", "50%", "Madeiramento calafetado e convés"],
        ["Lastro Interno Fixo (Sobre a Quilha)", "1.800", "0,30", "52%", "Lingotes de chumbo/ferro fundido"],
        ["Mastreação e Gurupés", "350", "3,20", "45%", "Mastro principal ~12m em madeira"],
        ["Velas e Aparelho de Manobra", "120", "2,50", "48%", "Vela de içar (pano grande) + Buja"],
        ["Motor Auxiliar Diesel (35-45 HP) + Eixo", "280", "0,60", "62%", "Motor de centro e transmissão"],
        ["Tanques (Diesel 120 L + Água 150 L)", "300", "0,55", "55%", "Autonomia para ida e volta"],
        ["Passageiros (10 pessoas) + Bagagens", "1.000", "1,20", "52%", "8 passageiros + 2 tripulantes"],
        ["Salvatagem, Fundeio e Miscelânea", "250", "0,70", "45%", "Conforme NORMAM-03"],
        ["TOTAL ESTIMADO (Δ)", "7.700 kg", "~0,78 m", "~51%", "Centro de Gravidade (KG) perfeitamente equilibrado"]
    ]
    pesos_table = Table(pesos_data, colWidths=[150, 60, 50, 65, 160])
    pesos_table.setStyle(TableStyle([
        ('BACKGROUND', (0,0), (-1,0), colors.HexColor("#0f3b5f")),
        ('TEXTCOLOR', (0,0), (-1,0), colors.white),
        ('FONTNAME', (0,0), (-1,0), 'Helvetica-Bold'),
        ('FONTSIZE', (0,0), (-1,-1), 8),
        ('PADDING', (0,0), (-1,-1), 4),
        ('GRID', (0,0), (-1,-1), 0.5, colors.HexColor("#cccccc")),
        ('ROWBACKGROUNDS', (0,1), (-1,-2), [colors.white, colors.HexColor("#f9fbfd")]),
        ('BACKGROUND', (0,-1), (-1,-1), colors.HexColor("#e6edf3")),
        ('FONTNAME', (0,-1), (-1,-1), 'Helvetica-Bold'),
        ('ALIGN', (1,0), (3,-1), 'CENTER'),
    ]))
    story.append(pesos_table)
    story.append(Spacer(1, 10))
    
    # 6. Plano de Vela e Propulsão Auxiliar
    story.append(Paragraph("6. Plano Vélico e Propulsão Auxiliar", h1_style))
    story.append(Paragraph("• <b>Armação de Saveiro:</b> Mastro único com inclinação clássica de 5° para a ré, operando uma grande vela de pena/içar com carangueja (~65 m²) e uma buja na proa acoplada ao gurupés (~22 m²), perfazendo <b>87 m² de área vélica</b>.", body_style))
    story.append(Paragraph("• <b>Motor Auxiliar:</b> Diesel marítimo de 35 a 45 HP com velocidade de cruzeiro de ~6,8 nós a motor e consumo de 2,8 L/h, garantindo autonomia de navegação superior a 35 horas.", body_style))
    
    story.append(Spacer(1, 14))
    story.append(Paragraph("<i>Documento gerado como material didático e memória de cálculo preliminar do curso de Design de Embarcações Brana / EEE.</i>", ParagraphStyle('FooterNote', parent=styles['Normal'], fontName='Helvetica-Oblique', fontSize=8, textColor=colors.HexColor("#666666"), alignment=1)))
    
    doc.build(story, canvasmaker=NumberedCanvas)
    print("PDF gerado com sucesso.")

build_pdf()
