import sys
from reportlab.lib.pagesizes import letter
from reportlab.lib import colors
from reportlab.lib.units import inch
from reportlab.lib.styles import getSampleStyleSheet, ParagraphStyle
from reportlab.platypus import (
    SimpleDocTemplate, Paragraph, Spacer, Table, TableStyle, Image, KeepTogether, HRFlowable
)
from reportlab.pdfgen import canvas

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_decorations(num_pages)
            super().showPage()
        super().save()

    def draw_page_decorations(self, page_count):
        self.saveState()
        self.setFont("Helvetica", 8)
        self.setFillColor(colors.HexColor("#4A5568"))
        
        # Header (pages > 1)
        if self._pageNumber > 1:
            self.drawString(54, 750, "Plano de Viagem Costeira: Salvador → Rio | Saveiro S. Jorge dos Ilhéus")
            self.setStrokeColor(colors.HexColor("#CBD5E0"))
            self.setLineWidth(0.5)
            self.line(54, 742, 558, 742)
            
        # Footer (all pages)
        self.setStrokeColor(colors.HexColor("#CBD5E0"))
        self.setLineWidth(0.5)
        self.line(54, 45, 558, 45)
        
        footer_text = f"Página {self._pageNumber} de {page_count}"
        self.drawRightString(558, 32, footer_text)
        self.drawString(54, 32, "Brana Escola de Arquitetura e Engenharia Naval | EEE Salvador")
        self.restoreState()

def build_pdf(filename):
    doc = SimpleDocTemplate(
        filename,
        pagesize=letter,
        leftMargin=54,
        rightMargin=54,
        topMargin=54,
        bottomMargin=54
    )

    styles = getSampleStyleSheet()

    # Custom styles
    primary_color = colors.HexColor("#1A365D")   # Deep Navy
    secondary_color = colors.HexColor("#2B6CB0") # Marine Blue
    accent_color = colors.HexColor("#C53030")    # Crimson Alert
    dark_text = colors.HexColor("#2D3748")
    light_bg = colors.HexColor("#F7FAFC")

    title_style = ParagraphStyle(
        'DocTitle',
        parent=styles['Heading1'],
        fontName='Helvetica-Bold',
        fontSize=20,
        leading=24,
        textColor=primary_color,
        spaceAfter=4
    )

    subtitle_style = ParagraphStyle(
        'DocSubtitle',
        parent=styles['Normal'],
        fontName='Helvetica',
        fontSize=11,
        leading=15,
        textColor=secondary_color,
        spaceAfter=12
    )

    h1_style = ParagraphStyle(
        'SectionH1',
        parent=styles['Heading2'],
        fontName='Helvetica-Bold',
        fontSize=13,
        leading=16,
        textColor=primary_color,
        spaceBefore=12,
        spaceAfter=6,
        keepWithNext=True
    )

    h2_style = ParagraphStyle(
        'SectionH2',
        parent=styles['Heading3'],
        fontName='Helvetica-Bold',
        fontSize=10.5,
        leading=14,
        textColor=secondary_color,
        spaceBefore=8,
        spaceAfter=3,
        keepWithNext=True
    )

    body_style = ParagraphStyle(
        'BodyDark',
        parent=styles['Normal'],
        fontName='Helvetica',
        fontSize=9,
        leading=12.5,
        textColor=dark_text,
        spaceAfter=5
    )

    body_bold = ParagraphStyle(
        'BodyDarkBold',
        parent=body_style,
        fontName='Helvetica-Bold'
    )

    alert_style = ParagraphStyle(
        'AlertBox',
        parent=body_style,
        textColor=colors.HexColor("#742A2A"),
        backColor=colors.HexColor("#FFF5F5"),
        borderColor=colors.HexColor("#FEB2B2"),
        borderWidth=1,
        borderPadding=6,
        spaceBefore=4,
        spaceAfter=6
    )

    table_cell = ParagraphStyle(
        'TableCell',
        parent=styles['Normal'],
        fontName='Helvetica',
        fontSize=8.5,
        leading=11,
        textColor=dark_text
    )

    table_header = ParagraphStyle(
        'TableHeader',
        parent=styles['Normal'],
        fontName='Helvetica-Bold',
        fontSize=8.5,
        leading=11,
        textColor=colors.white
    )

    story = []

    # Title Banner
    story.append(Paragraph("PLANO DE VIAGEM COSTEIRA", title_style))
    story.append(Paragraph("Salvador (BA) → Rio de Janeiro (RJ) | Saveiro de Barra-a-Fora <i>S. Jorge dos Ilhéus</i>", subtitle_style))
    story.append(HRFlowable(width="100%", thickness=1.5, color=primary_color, spaceAfter=10))

    # Meta Info Table
    info_data = [
        [Paragraph("<b>Aluno:</b> Aristides Cheto", table_cell), Paragraph("<b>Instituição:</b> Brana / Estaleiro Escola Embrião (EEE)", table_cell)],
        [Paragraph("<b>Data:</b> Setembro / 2026", table_cell), Paragraph("<b>Área de Navegação:</b> Mar Aberto / Cabotagem Costeira", table_cell)],
    ]
    info_table = Table(info_data, colWidths=[250, 254])
    info_table.setStyle(TableStyle([
        ('BACKGROUND', (0,0), (-1,-1), colors.HexColor("#EDF2F7")),
        ('BOX', (0,0), (-1,-1), 0.5, colors.HexColor("#CBD5E0")),
        ('VALIGN', (0,0), (-1,-1), 'MIDDLE'),
        ('TOPPADDING', (0,0), (-1,-1), 4),
        ('BOTTOMPADDING', (0,0), (-1,-1), 4),
        ('LEFTPADDING', (0,0), (-1,-1), 8),
        ('RIGHTPADDING', (0,0), (-1,-1), 8),
    ]))
    story.append(info_table)
    story.append(Spacer(1, 10))

    # Section 1: Características da Embarcação
    story.append(Paragraph("1. CARACTERÍSTICAS DA EMBARCAÇÃO", h1_style))
    
    # Table with image on side or specs table
    specs_data = [
        [Paragraph("<b>Parâmetro</b>", table_header), Paragraph("<b>Valor de Projeto</b>", table_header), Paragraph("<b>Significado Prático / Impacto Operacional</b>", table_header)],
        [Paragraph("Comprimento Total (LOA)", table_cell), Paragraph("25,00 m", table_cell), Paragraph("Grande porte (~82 pés), excelente volume e capacidade de autonomia.", table_cell)],
        [Paragraph("Boca Máxima (B)", table_cell), Paragraph("8,00 m", table_cell), Paragraph("Alta estabilidade inicial de forma; conforto e espaço de convés.", table_cell)],
        [Paragraph("Calado de Projeto (T)", table_cell), Paragraph("2,00 m", table_cell), Paragraph("<b>Atenção:</b> Exige estofo de preamar para entrar em barras rasas.", table_cell)],
        [Paragraph("Traquete (Mastro de Proa)", table_cell), Paragraph("10,00 m", table_cell), Paragraph("Vela de vante; auxilia no equilíbrio direcional e manobras.", table_cell)],
        [Paragraph("Mastro Grande (Central)", table_cell), Paragraph("15,00 m", table_cell), Paragraph("Principal força propulsora com ventos de través e popa.", table_cell)],
        [Paragraph("Mezena (Mastro de Ré)", table_cell), Paragraph("19,00 m", table_cell), Paragraph("Grande plano vélico à ré; estabilidade de rumo e contra-balanço.", table_cell)],
        [Paragraph("Velocidade de Cruzeiro", table_cell), Paragraph("6,0 a 7,0 nós", table_cell), Paragraph("Deslocamento eficiente em mar aberto.", table_cell)],
        [Paragraph("Tripulação Recomendada", table_cell), Paragraph("6 a 8 pessoas", table_cell), Paragraph("Permite regime de quartos de serviço (turnos 4h x 8h).", table_cell)],
    ]
    specs_table = Table(specs_data, colWidths=[130, 84, 290])
    specs_table.setStyle(TableStyle([
        ('BACKGROUND', (0,0), (-1,0), primary_color),
        ('GRID', (0,0), (-1,-1), 0.5, colors.HexColor("#CBD5E0")),
        ('ROWBACKGROUNDS', (0,1), (-1,-1), [colors.white, light_bg]),
        ('VALIGN', (0,0), (-1,-1), 'MIDDLE'),
        ('TOPPADDING', (0,0), (-1,-1), 3.5),
        ('BOTTOMPADDING', (0,0), (-1,-1), 3.5),
        ('LEFTPADDING', (0,0), (-1,-1), 5),
        ('RIGHTPADDING', (0,0), (-1,-1), 5),
    ]))
    story.append(specs_table)
    story.append(Spacer(1, 10))

    # Section 2: Diretrizes Gerais de Navegação e Meteorologia
    story.append(Paragraph("2. DIRETRIZES METEOROLÓGICAS E NAVEGAÇÃO COSTEIRA", h1_style))
    story.append(Paragraph("• <b>Ventos Predominantes:</b> Quadrante Leste/Nordeste (E/NE) sopram a favor durante a descida pela costa baiana e capixaba, permitindo navegar com panos cheios em ventos de popa e través folgado.", body_style))
    story.append(Paragraph("• <b>Frentes Frias (Atenção Crítica):</b> Frentes polares sobem do Sul trazendo ventos de Sudoeste/Sul (SW/S) contra a proa e mar encapelado. <i>Regra inegociável:</i> nunca iniciar uma etapa longa sem janela de tempo estável de pelo menos 36 horas confirmada pela Meteomarinha.", body_style))
    story.append(Paragraph("• <b>Corrente do Brasil:</b> Escorre no sentido Norte → Sul ao largo da plataforma continental, fornecendo ganho de velocidade de 0,5 a 1,5 nós a favor da rota.", body_style))
    story.append(Paragraph("• <b>Navegação com Calado de 2,0 m:</b> Entradas de barras e rios rasos (Porto Seguro, Santo André, Camamu) devem ocorrer impreterivelmente no estofo de preamar (maré alta).", body_style))
    
    story.append(Spacer(1, 10))

    # Section 3: Roteiro Detalhado em 6 Etapas
    story.append(Paragraph("3. ROTEIRO DETALHADO EM 6 ETAPAS", h1_style))

    etapas = [
        ("ETAPA 1: Salvador (BA) → Ilhéus (BA)", "110 MN", "16 a 18 h",
         "Saída pela Baía de Todos-os-Santos contornando a Ponta dos Frades. Rumo Sul a cerca de 5 a 10 MN da costa. Aproximação pelo canal profundo do Porto do Malhado / Baía do Pontal em Ilhéus (seguro para 2,0 m em qualquer maré)."),
        
        ("ETAPA 2: Ilhéus (BA) → Porto Seguro / Santo André (BA)", "65 MN", "9 a 11 h",
         "Navegação costeira margeando as praias do sul da Bahia (Olivença, Una, Canavieiras, Belmonte). Entrada em Santo André (Rio João de Tiba) ou Porto Seguro estritamente no estofo de preamar."),
        
        ("ETAPA 3: Porto Seguro (BA) → Arquipélago dos Abrolhos / Caravelas (BA)", "75 MN", "11 a 13 h",
         "Travessia do Parcel das Paredes. Passagem segura pelo Canal dos Abrolhos (entre o continente e o arquipélago). Fondeio abrigado na Ilha de Santa Bárbara ou canal de Caravelas."),
        
        ("ETAPA 4: Abrolhos (BA) → Vitória / Vila Velha (ES)", "150 MN", "22 a 25 h",
         "<b>Perna longa oceânica (crucial).</b> Exige janela meteorológica confirmada de 36h de vento E/NE. Travessia ao largo da foz do Rio Doce. Entrada pelo canal largo e abrigado de Vitória (suporte completo de diesel e água doce no ICES)."),
        
        ("ETAPA 5: Vitória (ES) → Armação dos Búzios (RJ)", "160 MN", "24 a 26 h",
         "Transição para o litoral fluminense passando ao largo de Guarapari, Itapemirim e bacia de Campos/Macaé. Fondeio seguro na Enseada da Armação/Manguinhos em Búzios para aguardar a melhor hora de dobrar o Cabo Frio."),
        
        ("ETAPA 6: Búzios (RJ) → Cabo Frio (RJ) → Rio de Janeiro (RJ)", "95 MN", "14 a 16 h",
         "<b>Ponto Crítico:</b> Dobrar o Cabo Frio no final da madrugada com mar calmo e vento favorável. Entrada triunfal na Baía de Guanabara entre a Fortaleza de Santa Cruz e Pão de Açúcar, com destino no ICRJ ou Marina da Glória.")
    ]

    etapa_table_data = [
        [Paragraph("<b>Etapa / Trecho</b>", table_header), Paragraph("<b>Distância</b>", table_header), Paragraph("<b>Tempo Estimado</b>", table_header), Paragraph("<b>Estratégia e Instruções de Navegação</b>", table_header)]
    ]

    for title, dist, tempo, desc in etapas:
        etapa_table_data.append([
            Paragraph(f"<b>{title}</b>", table_cell),
            Paragraph(dist, table_cell),
            Paragraph(tempo, table_cell),
            Paragraph(desc, table_cell)
        ])

    etapa_table = Table(etapa_table_data, colWidths=[130, 48, 56, 270])
    etapa_table.setStyle(TableStyle([
        ('BACKGROUND', (0,0), (-1,0), primary_color),
        ('GRID', (0,0), (-1,-1), 0.5, colors.HexColor("#CBD5E0")),
        ('ROWBACKGROUNDS', (0,1), (-1,-1), [colors.white, light_bg]),
        ('VALIGN', (0,0), (-1,-1), 'TOP'),
        ('TOPPADDING', (0,0), (-1,-1), 4),
        ('BOTTOMPADDING', (0,0), (-1,-1), 4),
        ('LEFTPADDING', (0,0), (-1,-1), 5),
        ('RIGHTPADDING', (0,0), (-1,-1), 5),
    ]))
    story.append(etapa_table)
    story.append(Spacer(1, 10))

    # Section 4: Balanço Geral e Requisitos Logísticos
    story.append(Paragraph("4. BALANÇO OPERACIONAL E AUTONOMIA", h1_style))
    
    balanco_data = [
        [Paragraph("<b>Item / Recurso</b>", table_header), Paragraph("<b>Estimativa de Projeto</b>", table_header), Paragraph("<b>Detalhamento Técnico / Margem de Segurança</b>", table_header)],
        [Paragraph("Distância Total Navegada", table_cell), Paragraph("~655 a 750 MN", table_cell), Paragraph("Varia conforme aproximações e desvios de segurança em baixios.", table_cell)],
        [Paragraph("Horas de Leme Efetivas", table_cell), Paragraph("~100 a 115 horas", table_cell), Paragraph("Baseado em velocidade média de deslocamento de 6,0 a 7,0 nós.", table_cell)],
        [Paragraph("Duração Total com Escalas", table_cell), Paragraph("10 a 14 dias", table_cell), Paragraph("Inclui períodos de descanso e margem de espera de janelas de tempo.", table_cell)],
        [Paragraph("Água Potável Mínima", table_cell), Paragraph("1.500 a 2.000 Litros", table_cell), Paragraph("Consumo de ~15 L/pessoa/dia para 8 pessoas com margem de segurança.", table_cell)],
        [Paragraph("Combustível Diesel (Auxiliar)", table_cell), Paragraph("400 a 600 Litros", table_cell), Paragraph("Garante mínimo de 50 a 60 horas de autonomia em rotação econômica.", table_cell)],
        [Paragraph("Comunicação & Salvatagem", table_cell), Paragraph("Classe Mar Aberto", table_cell), Paragraph("VHF Marítimo (Canais 16/68), AIS Classe B, Cartas DHN e EPIRB.", table_cell)],
    ]
    balanco_table = Table(balanco_data, colWidths=[130, 94, 280])
    balanco_table.setStyle(TableStyle([
        ('BACKGROUND', (0,0), (-1,0), secondary_color),
        ('GRID', (0,0), (-1,-1), 0.5, colors.HexColor("#CBD5E0")),
        ('ROWBACKGROUNDS', (0,1), (-1,-1), [colors.white, light_bg]),
        ('VALIGN', (0,0), (-1,-1), 'MIDDLE'),
        ('TOPPADDING', (0,0), (-1,-1), 3.5),
        ('BOTTOMPADDING', (0,0), (-1,-1), 3.5),
        ('LEFTPADDING', (0,0), (-1,-1), 5),
        ('RIGHTPADDING', (0,0), (-1,-1), 5),
    ]))
    story.append(balanco_table)

    # Build PDF
    doc.build(story, canvasmaker=NumberedCanvas)

if __name__ == "__main__":
    out_pdf = "/home/magdalena/eee/alunos/aristides-cheto/plano_de_viagem_salvador_rio.pdf"
    build_pdf(out_pdf)
    print(f"PDF successfully generated at: {out_pdf}")
