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, "Relatório de Área de Navegação e Plano de Viagem | 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()

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

    title_style = ParagraphStyle(
        'DocTitle',
        parent=styles['Heading1'],
        fontName='Helvetica-Bold',
        fontSize=18,
        leading=22,
        textColor=primary_color,
        spaceAfter=3
    )

    subtitle_style = ParagraphStyle(
        'DocSubtitle',
        parent=styles['Normal'],
        fontName='Helvetica',
        fontSize=10.5,
        leading=14,
        textColor=secondary_color,
        spaceAfter=10
    )

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

    body_style = ParagraphStyle(
        'BodyDark',
        parent=styles['Normal'],
        fontName='Helvetica',
        fontSize=8.5,
        leading=12,
        textColor=dark_text,
        spaceAfter=4
    )

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

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

    story = []

    # Title Banner
    story.append(Paragraph("RELATÓRIO TÉCNICO DE NAVEGAÇÃO", title_style))
    story.append(Paragraph("Área de Navegação, Condições Hidro-Meteorológicas e Plano de Viagem Salvador → Rio", subtitle_style))
    story.append(HRFlowable(width="100%", thickness=1.5, color=primary_color, spaceAfter=8))

    # Meta Info Table
    info_data = [
        [Paragraph("<b>Aluno / Projetista:</b> Aristides Cheto", table_cell), Paragraph("<b>Instituição:</b> Brana / Estaleiro Escola Embrião (EEE)", table_cell)],
        [Paragraph("<b>Embarcação:</b> Saveiro de Barra-a-Fora <i>S. Jorge dos Ilhéus</i>", table_cell), Paragraph("<b>Classificação da Área:</b> Mar Aberto / Cabotagem Costeira", table_cell)],
        [Paragraph("<b>Dimensões Principais:</b> LOA 25,0 m | Boca 8,0 m | Calado 2,0 m", table_cell), Paragraph("<b>Data do Relatório:</b> Setembro / 2026", 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), 3),
        ('BOTTOMPADDING', (0,0), (-1,-1), 3),
        ('LEFTPADDING', (0,0), (-1,-1), 6),
        ('RIGHTPADDING', (0,0), (-1,-1), 6),
    ]))
    story.append(info_table)
    story.append(Spacer(1, 8))

    # 1. Caracterização da Área de Navegação
    story.append(Paragraph("1. CARACTERIZAÇÃO DA ÁREA DE NAVEGAÇÃO (COSTA LESTE E SUDESTE)", h1_style))
    story.append(Paragraph("A rota compreende a navegação costeira (cabotagem) entre a Baía de Todos-os-Santos (13°S) e a Baía de Guanabara (23°S), totalizando cerca de 750 milhas náuticas ao longo dos estados da Bahia, Espírito Santo e Rio de Janeiro. A área é dividida em três setores oceanográficos distintos:", body_style))
    
    setores_data = [
        [Paragraph("<b>Setor Costeiro</b>", table_header), Paragraph("<b>Extensão</b>", table_header), Paragraph("<b>Características Hidrográficas e Meteorológicas</b>", table_header)],
        [Paragraph("Setor 1: Costa Sul da Bahia", table_cell), Paragraph("Salvador → Abrolhos<br/>(~250 MN)", table_cell), Paragraph("Regime de alísios constante (ventos de E/NE). Presença do Parcel das Paredes e Banco dos Abrolhos (plataforma rasa extensa). Exige navegação atenta a baixios e recifes.", table_cell)],
        [Paragraph("Setor 2: Costa Capixaba", table_cell), Paragraph("Abrolhos → Vitória<br/>(~150 MN)", table_cell), Paragraph("Mar aberto profundo, foz do Rio Doce (águas turvas e correntes de descarga). Transição de regime de ventos; maior incidência de mar de fundo (swell) de S/SE.", table_cell)],
        [Paragraph("Setor 3: Costa Fluminense", table_cell), Paragraph("Vitória → Rio de Janeiro<br/>(~255 MN)", table_cell), Paragraph("Região de forte influência de frentes frias vindas do Sul (ventos de SW). O contorno do Cabo Frio representa a mudança de rumo da costa (N-S para E-W) e aceleração de vento/mar.", table_cell)],
    ]
    setores_table = Table(setores_data, colWidths=[120, 94, 290])
    setores_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), 3),
        ('BOTTOMPADDING', (0,0), (-1,-1), 3),
        ('LEFTPADDING', (0,0), (-1,-1), 5),
        ('RIGHTPADDING', (0,0), (-1,-1), 5),
    ]))
    story.append(setores_table)
    story.append(Spacer(1, 8))

    # 2. Dados Hidro-Meteorológicos e Diretrizes de Navegação
    story.append(Paragraph("2. DINÂMICA HIDRO-METEOROLÓGICA E NORMAS DE SEGURANÇA", h1_style))
    story.append(Paragraph("• <b>Regime de Ventos:</b> Ventos predominantes de Leste/Nordeste (E/NE) com intensidade típica de 10 a 20 nós na descida. Frentes frias ocasionam vento súbito de SW/S de 25 a 35 nós. <b>Diretriz:</b> suspender travessia apenas com boletim Meteomarinha indicando janela estável de 36 horas.", body_style))
    story.append(Paragraph("• <b>Correntes Marítimas:</b> A Corrente do Brasil flui para o Sul com velocidade média de 0,5 a 1,5 nós na isóbata de 100m, proporcionando ganho de velocidade de deslocamento para a rota.", body_style))
    story.append(Paragraph("• <b>Restrições de Calado (2,0 m):</b> Entradas de barras rasas e estuários fluviais (Porto Seguro, Santo André, Camamu) devem ser feitas exclusivamente no estofo de preamar (maré alta diurna).", body_style))
    story.append(Paragraph("• <b>Cartografia Oficial DHN:</b> Cartas de Rota Série 1000/2000; Cartas de Aproximação 1101 (Salvador), 1201 (Ilhéus), 1301 (Abrolhos), 1401 (Vitória), 1501 (Cabo Frio) e 1511 (Rio de Janeiro).", body_style))
    story.append(Spacer(1, 8))

    # 3. Plano de Viagem em 6 Etapas
    story.append(Paragraph("3. PLANO OPERACIONAL DE VIAGEM (6 ETAPAS)", h1_style))
    
    etapas = [
        ("ETAPA 1: Salvador (BA) → Ilhéus (BA)", "110 MN", "16 a 18 h", "Saída da BTS rumo Sul. Aproximação pelo canal profundo do Porto do Malhado 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 falésias. Entrada em Santo André ou Porto Seguro estritamente no estofo de preamar."),
        ("ETAPA 3: Porto Seguro (BA) → Abrolhos / Caravelas (BA)", "75 MN", "11 a 13 h", "Travessia do Parcel das Paredes pelo Canal dos Abrolhos. 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 oceânica longa.</b> Janela confirmada de 36h de vento E/NE. Entrada no canal abrigado de Vitória (apoio no ICES)."),
        ("ETAPA 5: Vitória (ES) → Armação dos Búzios (RJ)", "160 MN", "24 a 26 h", "Passagem ao largo de Guarapari e Bacia de Campos. Fondeio seguro em Búzios para aguardar a janela de 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 Cabo Frio de madrugada/manhã com tempo bom. Chegada na Baía de Guanabara (ICRJ/Marina da Glória).")
    ]

    etapa_table_data = [
        [Paragraph("<b>Etapa / Trecho</b>", table_header), Paragraph("<b>Distância</b>", table_header), Paragraph("<b>Tempo</b>", table_header), Paragraph("<b>Instruções e Estratégia 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, 48, 278])
    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), 3),
        ('BOTTOMPADDING', (0,0), (-1,-1), 3),
        ('LEFTPADDING', (0,0), (-1,-1), 5),
        ('RIGHTPADDING', (0,0), (-1,-1), 5),
    ]))
    story.append(etapa_table)
    story.append(Spacer(1, 8))

    # 4. Balanço Operacional
    story.append(Paragraph("4. BALANÇO DE RECURSOS E AUTONOMIA", h1_style))
    balanco_data = [
        [Paragraph("<b>Item</b>", table_header), Paragraph("<b>Valor Estimado</b>", table_header), Paragraph("<b>Margem e Observações Técnicas</b>", table_header)],
        [Paragraph("Distância Total Navegada", table_cell), Paragraph("~655 a 750 MN", table_cell), Paragraph("Inclui aproximações e desvios de segurança em baixios.", table_cell)],
        [Paragraph("Tempo Efetivo de Leme", table_cell), Paragraph("~100 a 115 horas", table_cell), Paragraph("Velocidade média estimada entre 6,0 e 7,0 nós.", table_cell)],
        [Paragraph("Duração Total com Escalas", table_cell), Paragraph("10 a 14 dias", table_cell), Paragraph("Contempla descanso da tripulação e janelas meteorológicas.", table_cell)],
        [Paragraph("Reserva de Água Doce", table_cell), Paragraph("1.500 a 2.000 Litros", table_cell), Paragraph("Mínimo de 15 L/homem/dia para 6 a 8 tripulantes.", table_cell)],
        [Paragraph("Autonomia Diesel (Motor)", table_cell), Paragraph("400 a 600 Litros", table_cell), Paragraph("Garante no mínimo 50 a 60 horas contínuas de propulsão auxiliar.", table_cell)],
        [Paragraph("Comunicações e Segurança", table_cell), Paragraph("NORMAM-03 / Mar Aberto", table_cell), Paragraph("VHF (Ch 16/68), AIS B, EPIRB, Balsa Salva-Vidas e Cartas DHN.", 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),
        ('BOTTOMPADDING', (0,0), (-1,-1), 3),
        ('LEFTPADDING', (0,0), (-1,-1), 5),
        ('RIGHTPADDING', (0,0), (-1,-1), 5),
    ]))
    story.append(balanco_table)

    doc.build(story, canvasmaker=NumberedCanvas)

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