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")
            self.setFont("Helvetica", 8)
            self.setFillColor(colors.HexColor("#64748B"))
            self.drawRightString(541, 802, "Saveiro Costeiro 6,30m • Análise da Área de Navegação")
            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, "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(541, 36, page_text)
        self.setStrokeColor(colors.HexColor("#CBD5E1"))
        self.setLineWidth(0.5)
        self.line(54, 48, 541, 48)
        
        self.restoreState()

def gerar_relatorio_navegacao():
    pdf_path = "/home/magdalena/eee/alunos/antonio-manoel-costa/Area_de_Navegacao_Antonio_Manoel_Costa.pdf"
    img_dir = "/home/magdalena/eee/alunos/antonio-manoel-costa/cartas"
    
    img_saida = os.path.join(img_dir, "Z1_Rio_Vermelho_Baia_de_Todos_os_Santos_saida.png")
    img_percurso = os.path.join(img_dir, "Z1_Rio_Vermelho_Baia_de_Todos_os_Santos_percurso.png")
    img_chegada = os.path.join(img_dir, "Z1_Rio_Vermelho_Baia_de_Todos_os_Santos_chegada.png")

    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("#F1F5F9")     # Fundo suave tabelas
    c_alert = colors.HexColor("#C0392B")

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

    subtitle_style = ParagraphStyle(
        'DocSubtitle',
        parent=styles['Normal'],
        fontName='Helvetica',
        fontSize=10,
        leading=14,
        textColor=c_secondary,
        alignment=1,
        spaceAfter=12
    )

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

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

    body_style = ParagraphStyle(
        'Body_Custom',
        parent=styles['Normal'],
        fontName='Helvetica',
        fontSize=8.5,
        leading=11.5,
        textColor=c_dark,
        alignment=4, # Justificado
        spaceAfter=4
    )

    bullet_style = ParagraphStyle(
        'Bullet_Custom',
        parent=body_style,
        leftIndent=12,
        firstLineIndent=-8,
        spaceAfter=3
    )

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

    table_body_style = ParagraphStyle(
        'TB_Style',
        parent=styles['Normal'],
        fontName='Helvetica',
        fontSize=8,
        leading=10,
        textColor=c_dark
    )

    table_body_center = ParagraphStyle(
        'TB_Center',
        parent=table_body_style,
        alignment=1
    )

    caption_style = ParagraphStyle(
        'CaptionStyle',
        parent=styles['Normal'],
        fontName='Helvetica-Oblique',
        fontSize=7.5,
        leading=9.5,
        textColor=colors.HexColor("#64748B"),
        alignment=1,
        spaceAfter=6
    )

    elements = []

    # ==================== CABEÇALHO DO DOCUMENTO ====================
    elements.append(Paragraph("ANÁLISE DA ÁREA DE NAVEGAÇÃO E CONDICIONANTES OPERACIONAIS", title_style))
    elements.append(Paragraph("Metodologia de Projeto BRANA / Estaleiro Escola Embrião • Saveiro Costeiro 6,30 m", subtitle_style))
    elements.append(HRFlowable(width="100%", thickness=1.5, color=c_accent, spaceBefore=0, spaceAfter=8))

    # Tabela de Dados Gerais do Projeto
    meta_data = [
        [
            Paragraph("<b>Aluno / Projetista:</b> Antônio Manoel Costa", table_body_style),
            Paragraph("<b>Grupo:</b> Grupo 4 (EEE / Brana)", table_body_style),
            Paragraph("<b>Embarcação:</b> Saveiro Costeiro 6,30 m", table_body_style)
        ],
        [
            Paragraph("<b>LOA / Boca / Pontal:</b> 6,30 m / 2,45 m / 0,95 m", table_body_style),
            Paragraph("<b>Calado (Leve / Bolina):</b> 0,32 m / 1,15 m", table_body_style),
            Paragraph("<b>Lotação / Propulsão:</b> 8 a 10 pax / Vela + Popa 8-15 HP", table_body_style)
        ]
    ]
    meta_table = Table(meta_data, colWidths=[165, 155, 167])
    meta_table.setStyle(TableStyle([
        ('BACKGROUND', (0,0), (-1,-1), c_light_bg),
        ('BOX', (0,0), (-1,-1), 0.5, colors.HexColor("#CBD5E1")),
        ('INNERGRID', (0,0), (-1,-1), 0.5, colors.HexColor("#CBD5E1")),
        ('TOPPADDING', (0,0), (-1,-1), 4),
        ('BOTTOMPADDING', (0,0), (-1,-1), 4),
        ('LEFTPADDING', (0,0), (-1,-1), 6),
        ('RIGHTPADDING', (0,0), (-1,-1), 6),
    ]))
    elements.append(meta_table)
    elements.append(Spacer(1, 8))

    # ==================== 1. INTRODUÇÃO E ESCOPO DA ANÁLISE ====================
    elements.append(Paragraph("1. Introdução e Princípio de Projeto BRANA", h1_style))
    elements.append(Paragraph(
        "Na metodologia da Escola BRANA, a <b>Área de Navegação não é apenas um mapa</b>, mas a matriz de condicionantes físicas e normativas que dita as dimensões principais, o calado, a borda livre, a forma do casco e o plano vélico da embarcação. O presente projeto consiste em um <b>Saveiro Costeiro Tradicional de 6,30 m</b>, construído em madeira pelo método artesanal do Estaleiro Escola Embrião (EEE), destinado ao transporte diurno de passageiros, turismo e lazer contemplativo na costa de Salvador e interior da Baía de Todos-os-Santos (BTS).",
        body_style
    ))

    # ==================== 2. CARACTERIZAÇÃO DA DERROTA OPERACIONAL ====================
    elements.append(Paragraph("2. Caracterização da Rota e Setores de Navegação", h1_style))
    elements.append(Paragraph(
        "A operação rotineira da embarcação compreende a saída da enseada abrigada da Colônia de Pescadores Z1 (Rio Vermelho), a travessia oceânica costeira contornando o Farol da Barra e o ingresso nas águas calmas da Baía de Todos-os-Santos, com extensões eventuais até Morro de São Paulo.",
        body_style
    ))

    rota_headers = [
        Paragraph("<b>Trecho / Setor</b>", table_header_style),
        Paragraph("<b>Extensão</b>", table_header_style),
        Paragraph("<b>Enquadramento NORMAM</b>", table_header_style),
        Paragraph("<b>Regime de Fundo / Calado</b>", table_header_style),
        Paragraph("<b>Condição Típica de Mar/Vento</b>", table_header_style)
    ]
    rota_data = [
        rota_headers,
        [
            Paragraph("<b>Setor 1: Saída Z1</b><br/>(Enseada Rio Vermelho)", table_body_style),
            Paragraph("0,5 MN", table_body_center),
            Paragraph("Mar Aberto Costeiro", table_body_style),
            Paragraph("Lajes e arrecifes.<br/>Calado limite: 0,32 m (sem bolina)", table_body_style),
            Paragraph("Rebentação costeira; abrigo parcial de pedras.", table_body_style)
        ],
        [
            Paragraph("<b>Setor 2: Costeiro / Barra</b><br/>(Rio Vermelho ↔ Barra)", table_body_style),
            Paragraph("3,8 MN", table_body_center),
            Paragraph("Mar Aberto Costeiro<br/>(Área 2 - até 20 MN)", table_body_style),
            Paragraph("Fundo arenoso/pedra.<br/>Profundidade > 8 m", table_body_style),
            Paragraph("Vagas de 1,0 a 1,6 m (SE/S). Vento E/SE 12-16 nós. Corrente forte.", table_body_style)
        ],
        [
            Paragraph("<b>Setor 3: Interior BTS</b><br/>(Barra ↔ Ribeira / Ilhas)", table_body_style),
            Paragraph("5,0 a 12 MN", table_body_center),
            Paragraph("Águas Abrigadas<br/>(Área 1)", table_body_style),
            Paragraph("Calado livre.<br/>Bolina arriada (1,15 m)", table_body_style),
            Paragraph("Águas calmas (<0,5 m). Vento regular E/SE 10-14 nós. Excelente orça.", table_body_style)
        ],
        [
            Paragraph("<b>Setor 4 (Extensão):</b><br/>Salvador ↔ Morro de SP", table_body_style),
            Paragraph("~34 MN", table_body_center),
            Paragraph("Mar Aberto Costeiro<br/>(Área 2)", table_body_style),
            Paragraph("Profundidades oceânicas costadas.", table_body_style),
            Paragraph("Ondulação oceânica de SE (1,5 a 2,0 m). Operação sob boletim favorável.", table_body_style)
        ]
    ]

    t_rota = Table(rota_data, colWidths=[105, 50, 95, 115, 122])
    t_rota.setStyle(TableStyle([
        ('BACKGROUND', (0,0), (-1,0), c_primary),
        ('ALIGN', (0,0), (-1,0), 'CENTER'),
        ('VALIGN', (0,0), (-1,-1), 'MIDDLE'),
        ('GRID', (0,0), (-1,-1), 0.5, colors.HexColor("#CBD5E1")),
        ('ROWBACKGROUNDS', (0,1), (-1,-1), [colors.white, c_light_bg]),
        ('TOPPADDING', (0,0), (-1,-1), 4),
        ('BOTTOMPADDING', (0,0), (-1,-1), 4),
        ('LEFTPADDING', (0,0), (-1,-1), 4),
        ('RIGHTPADDING', (0,0), (-1,-1), 4),
    ]))
    elements.append(t_rota)
    elements.append(Spacer(1, 8))

    # Inclusão da Carta do Percurso
    if os.path.exists(img_percurso):
        elements.append(RLImage(img_percurso, width=480, height=180))
        elements.append(Paragraph("Figura 1: Carta Náutica do Percurso Principal (Colônia Z1 Rio Vermelho ↔ Farol da Barra ↔ Baía de Todos-os-Santos).", caption_style))

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

    elements.append(Paragraph("3. Condicionantes Oceanográficas e Meteorológicas", h1_style))
    elements.append(Paragraph(
        "A interação do casco do saveiro com o meio físico baiano impõe desafios específicos que foram equalizados nas decisões de engenharia naval do projeto:",
        body_style
    ))

    elements.append(Paragraph("<b>• Regime de Ventos:</b> Predomínio marcante dos ventos alísios de Sudeste e Leste (E/SE) com intensidade média entre 10 e 16 nós. No trecho Rio Vermelho → Farol da Barra, a derrota segue rumo Oeste/Sudoeste, permitindo navegar com vento de través/alheta, condição de máximo rendimento para a tradicional <i>vela de içar</i> baiana.", bullet_style))
    elements.append(Paragraph("<b>• Ondulação e Agitação Marítima:</b> Fora da baía (trecho Rio Vermelho / Farol), o mar recebe a ondulação direta do Atlântico Sul (SE). O saveiro necessita de estabilidade inicial elevada para o conforto de passageiros da terceira idade e crianças, obtida através da <b>boca generosa de 2,45 m (B/L = 0,39)</b> e do bojo firme na seção mestra.", bullet_style))
    elements.append(Paragraph("<b>• Regime de Marés e Restrição de Calado:</b> Maré semidiurna com amplitude de sizígia de até 2,2 metros. Na enseada da Z1, pedras submersas limitam o trânsito na baixa-mar. A adoção de <b>bolina móvel / pivotante</b> permite reduzir o calado operacional para apenas <b>0,32 m</b>, possibilitando encalhe em areia e aproximação costeira irrestrita.", bullet_style))

    elements.append(Spacer(1, 4))
    elements.append(Paragraph("4. Análise Náutica dos Pontos Críticos (Cartas Detalhadas)", h1_style))

    # Tabela com as imagens de saída e chegada lado a lado se existirem
    cartas_cells = []
    if os.path.exists(img_saida) and os.path.exists(img_chegada):
        cartas_cells = [
            [
                RLImage(img_saida, width=235, height=140),
                RLImage(img_chegada, width=235, height=140)
            ],
            [
                Paragraph("<b>Detalhe A:</b> Saída do Rio Vermelho (Arrecifes e baixa profundidade)", caption_style),
                Paragraph("<b>Detalhe B:</b> Entrada na BTS / Porto da Barra (Águas calmas)", caption_style)
            ]
        ]
        t_cartas = Table(cartas_cells, colWidths=[240, 240])
        t_cartas.setStyle(TableStyle([
            ('ALIGN', (0,0), (-1,-1), 'CENTER'),
            ('VALIGN', (0,0), (-1,-1), 'MIDDLE'),
            ('LEFTPADDING', (0,0), (-1,-1), 2),
            ('RIGHTPADDING', (0,0), (-1,-1), 2),
            ('TOPPADDING', (0,0), (-1,-1), 2),
            ('BOTTOMPADDING', (0,0), (-1,-1), 2),
        ]))
        elements.append(t_cartas)
    
    elements.append(Spacer(1, 4))
    elements.append(Paragraph("5. Enquadramento Normativo NORMAM-211 (DPC / Marinha do Brasil)", h1_style))
    elements.append(Paragraph(
        "Para a conformidade legal da embarcação perante a Capitania dos Portos da Bahia (CPBA):",
        body_style
    ))

    norma_rows = [
        [Paragraph("<b>Item Normativo</b>", table_header_style), Paragraph("<b>Exigência / Aplicação no Projeto</b>", table_header_style), Paragraph("<b>Conformidade no Saveiro 6,30m</b>", table_header_style)],
        [
            Paragraph("<b>Classificação</b>", table_body_style),
            Paragraph("Embarcação Miúda / Esporte e Recreio ou Turismo/Passageiro.", table_body_style),
            Paragraph("Atende (Comprimento < 12m).", table_body_style)
        ],
        [
            Paragraph("<b>Área de Navegação</b>", table_body_style),
            Paragraph("Navegação Interior (Área 1) e Mar Aberto Costeiro (Área 2).", table_body_style),
            Paragraph("Dotação mista para operação segura na orla oceânica de Salvador.", table_body_style)
        ],
        [
            Paragraph("<b>Salvamento</b>", table_body_style),
            Paragraph("100% de coletes salva-vidas homologados (classe II/III) + 1 boia circular.", table_body_style),
            Paragraph("10 coletes estivados sob bancos estancos + boia na popa.", table_body_style)
        ],
        [
            Paragraph("<b>Comunicações e Luzes</b>", table_body_style),
            Paragraph("Rádio VHF marítimo (portátil ou fixo) + luzes de navegação BB/BE/Alcançado.", table_body_style),
            Paragraph("Painel elétrico 12V com bateria e rádio VHF portátil estanque.", table_body_style)
        ],
        [
            Paragraph("<b>Propulsão Auxiliar</b>", table_body_style),
            Paragraph("Garantia de manobrabilidade em calmarias e atracação portuária.", table_body_style),
            Paragraph("Motor de popa 8 a 15 HP em suporte reforçado de espelho de popa.", table_body_style)
        ]
    ]
    t_norma = Table(norma_rows, colWidths=[110, 210, 167])
    t_norma.setStyle(TableStyle([
        ('BACKGROUND', (0,0), (-1,0), c_secondary),
        ('VALIGN', (0,0), (-1,-1), 'MIDDLE'),
        ('GRID', (0,0), (-1,-1), 0.5, colors.HexColor("#CBD5E1")),
        ('ROWBACKGROUNDS', (0,1), (-1,-1), [colors.white, c_light_bg]),
        ('TOPPADDING', (0,0), (-1,-1), 3),
        ('BOTTOMPADDING', (0,0), (-1,-1), 3),
        ('LEFTPADDING', (0,0), (-1,-1), 4),
        ('RIGHTPADDING', (0,0), (-1,-1), 4),
    ]))
    elements.append(t_norma)
    elements.append(Spacer(1, 6))

    # ==================== 6. ESTIMATIVA DE DESEMPENHO E AUTONOMIA ====================
    elements.append(Paragraph("6. Estimativa de Velocidade, Tempos e Autonomia", h1_style))
    elements.append(Paragraph(
        "A velocidade de casco teórica (limite de deslocamento por onda) é dada por $V_k = 2,43 \\times \\sqrt{L_{WL}} \\approx 5,8$ nós (para $L_{WL} \\approx 5,80$ m). A velocidade operacional de cruzeiro à vela situa-se entre <b>5,0 e 6,5 nós</b>.",
        body_style
    ))

    desempenho_rows = [
        [Paragraph("<b>Perna / Derrota</b>", table_header_style), Paragraph("<b>Distância (MN)</b>", table_header_style), Paragraph("<b>Modo Propulsor</b>", table_header_style), Paragraph("<b>Vel. Média</b>", table_header_style), Paragraph("<b>Tempo Estimado</b>", table_header_style), Paragraph("<b>Consumo Estimado</b>", table_header_style)],
        [
            Paragraph("Z1 (Rio Vermelho) → Farol da Barra", table_body_style),
            Paragraph("3,8 MN", table_body_center),
            Paragraph("Vela (Içar) + Auxiliar saída", table_body_style),
            Paragraph("5,0 nós", table_body_center),
            Paragraph("~45 min", table_body_center),
            Paragraph("0,8 L (gasolina)", table_body_center)
        ],
        [
            Paragraph("Farol da Barra → Porto da Barra / Marina", table_body_style),
            Paragraph("2,1 MN", table_body_center),
            Paragraph("Vela Pura", table_body_style),
            Paragraph("5,5 nós", table_body_center),
            Paragraph("~23 min", table_body_center),
            Paragraph("0,0 L", table_body_center)
        ],
        [
            Paragraph("Travessia Salvador ↔ Morro de SP", table_body_style),
            Paragraph("34,0 MN", table_body_center),
            Paragraph("Vela + Motor reserva", table_body_style),
            Paragraph("5,5 nós", table_body_center),
            Paragraph("~6 h 10 min", table_body_center),
            Paragraph("4,0 a 6,0 L (margem)", table_body_center)
        ]
    ]
    t_perf = Table(desempenho_rows, colWidths=[130, 60, 100, 55, 65, 77])
    t_perf.setStyle(TableStyle([
        ('BACKGROUND', (0,0), (-1,0), c_primary),
        ('VALIGN', (0,0), (-1,-1), 'MIDDLE'),
        ('GRID', (0,0), (-1,-1), 0.5, colors.HexColor("#CBD5E1")),
        ('ROWBACKGROUNDS', (0,1), (-1,-1), [colors.white, c_light_bg]),
        ('TOPPADDING', (0,0), (-1,-1), 3),
        ('BOTTOMPADDING', (0,0), (-1,-1), 3),
        ('LEFTPADDING', (0,0), (-1,-1), 4),
        ('RIGHTPADDING', (0,0), (-1,-1), 4),
    ]))
    elements.append(t_perf)
    elements.append(Spacer(1, 6))

    # ==================== 7. CONCLUSÃO E RECOMENDAÇÕES DE PROJETO ====================
    elements.append(Paragraph("7. Conclusão e Diretrizes para o Projeto do Casco", h1_style))
    elements.append(Paragraph(
        "<b>1. Síntese Dimensional:</b> O dimensionamento com LOA de 6,30 m e Boca de 2,45 m responde perfeitamente à demanda de conforto e estabilidade em mar aberto costeiro, mantendo o barco leve para a manobra na praia do Rio Vermelho.<br/>"
        "<b>2. Caixa de Bolina:</b> Deve ser estruturada junto à sobrequilha com travamento estanque nas cavernas centrais, permitindo calado variável entre 0,32 m (praia/arrecife) e 1,15 m (orça na BTS).<br/>"
        "<b>3. Reserva de Borda Livre:</b> Manter pontal mínimo de 0,95 m na meia-nau e tosamento pronunciado a vante para evitar o embarque de água no contorno da Barra.",
        body_style
    ))

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

if __name__ == "__main__":
    gerar_relatorio_navegacao()
