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, Image as RLImage
)
from reportlab.lib.styles import getSampleStyleSheet, ParagraphStyle
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(54, 802, "BRANA | ESCOLA DE ENGENHARIA NAVAL & ESTALEIRO ESCOLA EMBRIÃO (EEE)")
            self.setFont("Helvetica", 8)
            self.setFillColor(colors.HexColor("#64748B"))
            self.drawRightString(541, 802, "Área de Navegação: Salvador ↔ Jaguaripe • Izana Sacramento")
            self.setStrokeColor(colors.HexColor("#CBD5E1"))
            self.setLineWidth(0.5)
            self.line(54, 794, 541, 794)

        # Footer (todas as páginas)
        self.setFont("Helvetica", 8)
        self.setFillColor(colors.HexColor("#64748B"))
        self.drawString(54, 36, "Aluna: Izana Sacramento • Orientação: Profª. Assistente Magdalena (Mada) — Brana/EEE")
        page_text = f"Página {self._pageNumber} de {page_count}"
        self.drawRightString(541, 36, page_text)
        self.setStrokeColor(colors.HexColor("#CBD5E1"))
        self.setLineWidth(0.5)
        self.line(54, 48, 541, 48)
        
        self.restoreState()

def gerar_pdf_area_navegacao():
    pdf_path = "/home/magdalena/eee/alunos/izana-sacramento/Area_de_Navegacao_Izana_Sacramento.pdf"
    
    doc = SimpleDocTemplate(
        pdf_path,
        pagesize=A4,
        leftMargin=54,
        rightMargin=54,
        topMargin=54,
        bottomMargin=54
    )

    styles = getSampleStyleSheet()

    c_primary = colors.HexColor("#0B2545")      # Azul Marinho Profundo
    c_secondary = colors.HexColor("#134074")    # Azul Naval
    c_accent = colors.HexColor("#0077B6")       # Azul Oceano
    c_dark = colors.HexColor("#1E293B")         # Texto Escuro
    c_light_bg = colors.HexColor("#F8FAFC")     # Fundo suave tabelas

    title_style = ParagraphStyle(
        'DocTitle',
        parent=styles['Normal'],
        fontName='Helvetica-Bold',
        fontSize=18,
        leading=22,
        textColor=c_primary,
        alignment=1,
        spaceAfter=4
    )

    subtitle_style = ParagraphStyle(
        'DocSubTitle',
        parent=styles['Normal'],
        fontName='Helvetica',
        fontSize=11,
        leading=15,
        textColor=c_secondary,
        alignment=1,
        spaceAfter=14
    )

    h1_style = ParagraphStyle(
        'Heading1_Custom',
        parent=styles['Normal'],
        fontName='Helvetica-Bold',
        fontSize=12,
        leading=15,
        textColor=c_primary,
        spaceBefore=12,
        spaceAfter=5,
        keepWithNext=True
    )

    h2_style = ParagraphStyle(
        'Heading2_Custom',
        parent=styles['Normal'],
        fontName='Helvetica-Bold',
        fontSize=10,
        leading=13,
        textColor=c_secondary,
        spaceBefore=8,
        spaceAfter=3,
        keepWithNext=True
    )

    body_style = ParagraphStyle(
        'Body_Custom',
        parent=styles['Normal'],
        fontName='Helvetica',
        fontSize=9,
        leading=13,
        textColor=c_dark,
        spaceAfter=5
    )

    bullet_style = ParagraphStyle(
        'Bullet_Custom',
        parent=body_style,
        leftIndent=14,
        firstLineIndent=-10,
        spaceAfter=3
    )

    tbl_header = ParagraphStyle(
        'TblHeader',
        parent=styles['Normal'],
        fontName='Helvetica-Bold',
        fontSize=8,
        leading=10,
        textColor=colors.white,
        alignment=1
    )

    tbl_cell = ParagraphStyle(
        'TblCell',
        parent=styles['Normal'],
        fontName='Helvetica',
        fontSize=8,
        leading=11,
        textColor=c_dark
    )

    tbl_cell_center = ParagraphStyle(
        'TblCellCenter',
        parent=tbl_cell,
        alignment=1
    )

    story = []

    # Cabeçalho Principal
    story.append(Paragraph("RELATÓRIO DE ÁREA DE NAVEGAÇÃO E DERROTA", title_style))
    story.append(Paragraph("<b>Caso de Uso · Análise Operacional Náutica, Climatologia e Restrições Hidrográficas</b><br/>Rota: Salvador (BTS) ↔ Rio Jaguaripe (Jaguaripe - BA)", subtitle_style))
    story.append(HRFlowable(width="100%", thickness=1.5, color=c_primary, spaceAfter=10))

    # Metadados do Projeto
    meta_data = [
        [Paragraph("<b>Projetista / Aluna:</b> Izana Sacramento", tbl_cell), Paragraph("<b>Data:</b> Setembro / 2026", tbl_cell)],
        [Paragraph("<b>Embarcação:</b> Saveiro Tradicional da Bahia (12 m)", tbl_cell), Paragraph("<b>Uso:</b> Passeio (10 pessoas) e Regatas Tradicionais", tbl_cell)],
        [Paragraph("<b>Área de Atuação:</b> Baía de Todos-os-Santos e Rio Jaguaripe", tbl_cell), Paragraph("<b>Cartas DHN:</b> 1110 (BTS) e 22500 (Costa)", tbl_cell)],
        [Paragraph("<b>Classificação NORMAM:</b> Navegação Interior (Área 1 e 2)", tbl_cell), Paragraph("<b>Orientação:</b> Profª. Magdalena (Mada) — Brana / EEE", tbl_cell)]
    ]
    meta_table = Table(meta_data, colWidths=[240, 240])
    meta_table.setStyle(TableStyle([
        ('BACKGROUND', (0,0), (-1,-1), colors.HexColor("#F1F5F9")),
        ('PADDING', (0,0), (-1,-1), 5),
        ('BOX', (0,0), (-1,-1), 0.5, colors.HexColor("#CBD5E1")),
        ('VALIGN', (0,0), (-1,-1), 'MIDDLE'),
    ]))
    story.append(meta_table)
    story.append(Spacer(1, 10))

    # 1. Resumo da Travessia em Números
    story.append(Paragraph("1. A Travessia em Números", h1_style))
    
    resumo_data = [
        [Paragraph("Parâmetro", tbl_header), Paragraph("Valor / Especificação", tbl_header), Paragraph("Impacto no Projeto do Casco", tbl_header)],
        [Paragraph("<b>Ponto Inicial</b>", tbl_cell), Paragraph("Salvador (Porto / Ribeira / Comércio) — 12° 58.0' S / 38° 31.0' W", tbl_cell), Paragraph("Saída por águas amplas com tráfego de ferry e navios.", tbl_cell)],
        [Paragraph("<b>Ponto Final</b>", tbl_cell), Paragraph("Cais de Jaguaripe (Rio Jaguaripe) — 13° 07.2' S / 38° 53.7' W", tbl_cell), Paragraph("Estuário abrigado, calha sinuosa com bancos de areia.", tbl_cell)],
        [Paragraph("<b>Distância pela Derrota</b>", tbl_cell), Paragraph("<b>31,5 MN (~58 km)</b> contornando baixios", tbl_cell), Paragraph("Exige autonomia segura de combustível e água doce.", tbl_cell)],
        [Paragraph("<b>Distância em Linha Reta</b>", tbl_cell), Paragraph("24,8 MN (~46 km)", tbl_cell), Paragraph("Desvio devido ao contorno de Itaparica e bancos.", tbl_cell)],
        [Paragraph("<b>Rumo Médio Verdadeiro</b>", tbl_cell), Paragraph("242° (SW / OSO)", tbl_cell), Paragraph("Excelente ângulo de través/alheta com vento de E/SE.", tbl_cell)],
        [Paragraph("<b>Calado Crítico de Acesso</b>", tbl_cell), Paragraph("<b>1,05 m máximo operacional</b>", tbl_cell), Paragraph("Limite imposto pela calha e baixios do Rio Jaguaripe.", tbl_cell)]
    ]
    resumo_table = Table(resumo_data, colWidths=[120, 180, 180])
    resumo_table.setStyle(TableStyle([
        ('BACKGROUND', (0,0), (-1,0), c_primary),
        ('PADDING', (0,0), (-1,-1), 4),
        ('GRID', (0,0), (-1,-1), 0.5, colors.HexColor("#CBD5E1")),
        ('ROWBACKGROUNDS', (0,1), (-1,-1), [colors.white, c_light_bg]),
        ('VALIGN', (0,0), (-1,-1), 'TOP'),
    ]))
    story.append(resumo_table)
    story.append(Spacer(1, 8))

    # Tabela de Tempo de Viagem
    tempo_data = [
        [Paragraph("Velocidade Média", tbl_header), Paragraph("Equivalente", tbl_header), Paragraph("Tempo Estimado de Rota (31,5 MN)", tbl_header), Paragraph("Regime de Operação Típico", tbl_header)],
        [Paragraph("5,0 nós", tbl_cell_center), Paragraph("9,3 km/h", tbl_cell_center), Paragraph("6 h 18 min", tbl_cell_center), Paragraph("Velejada relaxada / vento brando", tbl_cell)],
        [Paragraph("6,5 nós", tbl_cell_center), Paragraph("12,0 km/h", tbl_cell_center), Paragraph("4 h 50 min", tbl_cell_center), Paragraph("Velocidade de cruzeiro a motor diesel", tbl_cell)],
        [Paragraph("7,5 nós", tbl_cell_center), Paragraph("13,9 km/h", tbl_cell_center), Paragraph("4 h 12 min", tbl_cell_center), Paragraph("Regata / Vento fresco de alheta", tbl_cell)],
    ]
    tempo_table = Table(tempo_data, colWidths=[90, 80, 140, 170])
    tempo_table.setStyle(TableStyle([
        ('BACKGROUND', (0,0), (-1,0), c_secondary),
        ('PADDING', (0,0), (-1,-1), 4),
        ('GRID', (0,0), (-1,-1), 0.5, colors.HexColor("#CBD5E1")),
        ('ROWBACKGROUNDS', (0,1), (-1,-1), [colors.white, c_light_bg]),
        ('VALIGN', (0,0), (-1,-1), 'MIDDLE'),
    ]))
    story.append(tempo_table)
    story.append(Spacer(1, 10))

    # 2. Caracterização dos Trechos da Derrota
    story.append(Paragraph("2. Setorização e Análise dos Trechos da Rota", h1_style))
    story.append(Paragraph("A rota é dividida estrategicamente em três setores com dinâmicas hidrodinâmicas e operacionais completamente distintas:", body_style))
    story.append(Paragraph("• <b>Trecho A — Travessia da BTS (Salvador até Ponta de Itaparica / Canal) (~11 MN):</b> Águas abertas da baía. Presença de ondas curtas (0,6 m a 1,2 m) e mar picado vespertino gerado pela brisa de E/SE. Requer proa lançada com flaring para manter o convés seco e excelente estabilidade inicial para conforto dos 10 ocupantes.", bullet_style))
    story.append(Paragraph("• <b>Trecho B — Canal de Itaparica e Passagem do Garcez (~11 MN):</b> Área de transição abrigada entre a ilha e o continente. Atenção especial a bancos de areia, estreitamentos de canal e correntes de maré que podem atingir 2,0 a 2,5 nós nas pontas de maré.", bullet_style))
    story.append(Paragraph("• <b>Trecho C — Subida do Rio Jaguaripe até a Cidade (~9,5 MN):</b> Ambiente puramente estuarino/fluvial. Canal sinuoso cercado por manguezais, profundidades variáveis e restingas. Exige calado estático máximo de 1,05 m e motor auxiliar para manobras contra correnteza nas vazantes.", bullet_style))

    story.append(Spacer(1, 10))

    # 3. Climatologia, Ventos, Ondas e Regime de Marés
    story.append(Paragraph("3. Climatologia, Regime de Ventos e Marés (Banco de Dados CHM/DHN)", h1_style))
    
    clima_data = [
        [Paragraph("Mês", tbl_header), Paragraph("Vento Médio (nós)", tbl_header), Paragraph("Direção Predom.", tbl_header), Paragraph("Onda Média BTS (m)", tbl_header), Paragraph("Chuva (mm)", tbl_header), Paragraph("Condição de Navegação", tbl_header)],
        [Paragraph("Jan", tbl_cell_center), Paragraph("11,3", tbl_cell_center), Paragraph("E / ENE", tbl_cell_center), Paragraph("0,65", tbl_cell_center), Paragraph("78", tbl_cell_center), Paragraph("Excelente (Verão / Ventos Limpos)", tbl_cell)],
        [Paragraph("Fev", tbl_cell_center), Paragraph("10,8", tbl_cell_center), Paragraph("E / ENE", tbl_cell_center), Paragraph("0,60", tbl_cell_center), Paragraph("92", tbl_cell_center), Paragraph("Excelente (Ideal para turismo e regata)", tbl_cell)],
        [Paragraph("Mar", tbl_cell_center), Paragraph("10,3", tbl_cell_center), Paragraph("ESE", tbl_cell_center), Paragraph("0,70", tbl_cell_center), Paragraph("108", tbl_cell_center), Paragraph("Muito Boa", tbl_cell)],
        [Paragraph("Abr", tbl_cell_center), Paragraph("10,4", tbl_cell_center), Paragraph("ESE / SE", tbl_cell_center), Paragraph("0,80", tbl_cell_center), Paragraph("164", tbl_cell_center), Paragraph("Início das chuvas de outono", tbl_cell)],
        [Paragraph("Mai", tbl_cell_center), Paragraph("11,5", tbl_cell_center), Paragraph("SE", tbl_cell_center), Paragraph("0,95", tbl_cell_center), Paragraph("171", tbl_cell_center), Paragraph("Chuvoso / Mar mais cavado na BTS", tbl_cell)],
        [Paragraph("Jun", tbl_cell_center), Paragraph("12,2", tbl_cell_center), Paragraph("SE", tbl_cell_center), Paragraph("1,05", tbl_cell_center), Paragraph("158", tbl_cell_center), Paragraph("Inverno / Vento firme de SE", tbl_cell)],
        [Paragraph("Jul", tbl_cell_center), Paragraph("12,5", tbl_cell_center), Paragraph("SE", tbl_cell_center), Paragraph("1,10", tbl_cell_center), Paragraph("136", tbl_cell_center), Paragraph("Vento forte de través / alheta", tbl_cell)],
        [Paragraph("Ago", tbl_cell_center), Paragraph("12,2", tbl_cell_center), Paragraph("ESE", tbl_cell_center), Paragraph("0,95", tbl_cell_center), Paragraph("105", tbl_cell_center), Paragraph("Regata Aratu-Maragojipe / Transição", tbl_cell)],
        [Paragraph("Set", tbl_cell_center), Paragraph("11,9", tbl_cell_center), Paragraph("ESE", tbl_cell_center), Paragraph("0,85", tbl_cell_center), Paragraph("81", tbl_cell_center), Paragraph("Excelente / Tempo seco voltando", tbl_cell)],
        [Paragraph("Out", tbl_cell_center), Paragraph("11,9", tbl_cell_center), Paragraph("ENE", tbl_cell_center), Paragraph("0,75", tbl_cell_center), Paragraph("68", tbl_cell_center), Paragraph("Excelente para vela e passeios", tbl_cell)],
        [Paragraph("Nov", tbl_cell_center), Paragraph("12,2", tbl_cell_center), Paragraph("ENE", tbl_cell_center), Paragraph("0,70", tbl_cell_center), Paragraph("87", tbl_cell_center), Paragraph("Excelente (Temporada alta)", tbl_cell)],
        [Paragraph("Dez", tbl_cell_center), Paragraph("11,7", tbl_cell_center), Paragraph("ENE", tbl_cell_center), Paragraph("0,65", tbl_cell_center), Paragraph("61", tbl_cell_center), Paragraph("Excelente / Águas calmas", tbl_cell)],
    ]
    clima_table = Table(clima_data, colWidths=[40, 75, 75, 80, 55, 155])
    clima_table.setStyle(TableStyle([
        ('BACKGROUND', (0,0), (-1,0), c_primary),
        ('PADDING', (0,0), (-1,-1), 3),
        ('GRID', (0,0), (-1,-1), 0.5, colors.HexColor("#CBD5E1")),
        ('ROWBACKGROUNDS', (0,1), (-1,-1), [colors.white, c_light_bg]),
        ('VALIGN', (0,0), (-1,-1), 'MIDDLE'),
    ]))
    story.append(clima_table)
    story.append(Spacer(1, 10))

    story.append(PageBreak())

    # 4. Regime de Marés e Restrições de Calado
    story.append(Paragraph("4. Dinâmica de Marés e Restrição de Calado Operacional", h1_style))
    
    mare_data = [
        [Paragraph("Parâmetro de Maré", tbl_header), Paragraph("Porto de Salvador (Referência)", tbl_header), Paragraph("Foz / Rio Jaguaripe", tbl_header)],
        [Paragraph("Tipo de Maré", tbl_cell), Paragraph("Semidiurna (duas preamares e duas baixa-mares por dia)", tbl_cell), Paragraph("Semidiurna com defasagem de ~45 a 60 min", tbl_cell)],
        [Paragraph("Amplitude em Sizígia (Lua Cheia / Nova)", tbl_cell), Paragraph("<b>2,20 m a 2,80 m</b>", tbl_cell), Paragraph("<b>2,10 m a 2,60 m</b>", tbl_cell)],
        [Paragraph("Amplitude em Quadratura (Crescente / Minguante)", tbl_cell), Paragraph("0,90 m a 1,20 m", tbl_cell), Paragraph("0,80 m a 1,10 m", tbl_cell)],
        [Paragraph("Velocidade da Correnteza nos Canais", tbl_cell), Paragraph("1,0 a 2,0 nós", tbl_cell), Paragraph("<b>1,5 a 3,0 nós</b> (especialmente na vazante)", tbl_cell)],
        [Paragraph("Restrição Crítica de Calado", tbl_cell), Paragraph("Sem restrições no canal principal", tbl_cell), Paragraph("<b>Calado máximo recomendado: 1,10 m</b>", tbl_cell)]
    ]
    mare_table = Table(mare_data, colWidths=[140, 170, 170])
    mare_table.setStyle(TableStyle([
        ('BACKGROUND', (0,0), (-1,0), c_secondary),
        ('PADDING', (0,0), (-1,-1), 4),
        ('GRID', (0,0), (-1,-1), 0.5, colors.HexColor("#CBD5E1")),
        ('ROWBACKGROUNDS', (0,1), (-1,-1), [colors.white, c_light_bg]),
        ('VALIGN', (0,0), (-1,-1), 'TOP'),
    ]))
    story.append(mare_table)
    story.append(Spacer(1, 12))

    # 5. Diretrizes de Projeto Derivadas da Área de Navegação
    story.append(Paragraph("5. Requisitos de Engenharia Naval Derivados da Área de Navegação", h1_style))
    story.append(Paragraph("A análise rigorosa da derrota Salvador ↔ Jaguaripe impõe as seguintes decisões de arquitetura naval no saveiro de 12 metros:", body_style))
    story.append(Paragraph("1. <b>Calado de 1,05 m com caimento (drag) de quilha:</b> Permite transpor com folga as barras e baixios do Rio Jaguaripe mesmo em marés intermediárias, mantendo a quilha protegida contra impactos no fundo lodoso.", bullet_style))
    story.append(Paragraph("2. <b>Proa com Lançamento e Flaring:</b> Essencial para vencer o mar picado vespertino da Baía de Todos-os-Santos sem embarcar água, garantindo o conforto e segurança dos 10 passageiros no passeio.", bullet_style))
    story.append(Paragraph("3. <b>Boca Generosa (3,60 m) e Lastro Interno (1,8 t):</b> Garante alto momento restaurador inicial para suportar a grande área vélica (87 m²) nas regatas tradicionais e evitar adernamento excessivo durante o trânsito de pessoas a bordo.", bullet_style))
    story.append(Paragraph("4. <b>Motorização Auxiliar Diesel (35-45 HP com tanque de 120 L):</b> Assegura autonomia de mais de 35 horas a 6,5 nós, permitindo vencer a forte correnteza de vazante do Rio Jaguaripe (até 3 nós) caso o vento cesse.", bullet_style))
    
    story.append(Spacer(1, 15))
    story.append(Paragraph("<i>Documento técnico oficial de estudo de área de navegação gerado no âmbito 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 de Área de Navegação gerado com sucesso.")

gerar_pdf_area_navegacao()
