import os
from reportlab.lib.pagesizes import letter
from reportlab.lib import colors
from reportlab.lib.styles import getSampleStyleSheet, ParagraphStyle
from reportlab.platypus import (
    SimpleDocTemplate, Paragraph, Spacer, Table, TableStyle, HRFlowable, KeepTogether
)
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_header_footer(num_pages)
            super(NumberedCanvas, self).showPage()
        super(NumberedCanvas, self).save()

    def draw_header_footer(self, page_count):
        self.saveState()
        self.setFont("Helvetica-Bold", 8)
        self.setFillColor(colors.HexColor('#0B2545'))
        # Top Header
        self.drawString(40, 755, "ESTUDO TÉCNICO DE ENGENHARIA NAVAL — ANÁLISE INTEGRAL DE ÁREA DE NAVEGAÇÃO")
        self.setFont("Helvetica", 8)
        self.setFillColor(colors.HexColor('#64748B'))
        self.drawRightString(572, 755, "ROTA: BAHIA (BA) → PARÁ (PA)")
        
        self.setStrokeColor(colors.HexColor('#CBD5E1'))
        self.setLineWidth(0.5)
        self.line(40, 748, 572, 748)

        # Footer
        self.line(40, 45, 572, 45)
        self.setFont("Helvetica", 8)
        self.drawString(40, 32, "Escola de Arquitetura e Engenharia Naval — EEE / Brana | Profª Magdalena (Mada)")
        page_text = f"Página {self._pageNumber} de {page_count}"
        self.drawRightString(572, 32, page_text)
        self.restoreState()

def gerar_pdf_analise_completa():
    pdf_path = "/home/magdalena/eee/alunos/alessandra-feitosa/analise_completa_area_navegacao_alpha_centauri.pdf"
    
    doc = SimpleDocTemplate(
        pdf_path,
        pagesize=letter,
        rightMargin=40,
        leftMargin=40,
        topMargin=55,
        bottomMargin=55
    )
    
    styles = getSampleStyleSheet()
    
    # Estilos
    title_style = ParagraphStyle(
        'MainTitle',
        parent=styles['Heading1'],
        fontName='Helvetica-Bold',
        fontSize=17,
        leading=21,
        textColor=colors.HexColor('#0B2545'),
        spaceAfter=4
    )
    
    subtitle_style = ParagraphStyle(
        'SubTitle',
        parent=styles['Normal'],
        fontName='Helvetica-Bold',
        fontSize=10,
        leading=14,
        textColor=colors.HexColor('#134074'),
        spaceAfter=12
    )
    
    h1_sec = ParagraphStyle(
        'SectionH1',
        parent=styles['Heading2'],
        fontName='Helvetica-Bold',
        fontSize=12,
        leading=16,
        textColor=colors.HexColor('#0B2545'),
        spaceBefore=10,
        spaceAfter=5
    )

    h2_sub = ParagraphStyle(
        'SectionH2',
        parent=styles['Heading3'],
        fontName='Helvetica-Bold',
        fontSize=10.5,
        leading=14,
        textColor=colors.HexColor('#134074'),
        spaceBefore=6,
        spaceAfter=3
    )
    
    body = ParagraphStyle(
        'Body',
        parent=styles['Normal'],
        fontName='Helvetica',
        fontSize=9,
        leading=13,
        textColor=colors.HexColor('#1E293B'),
        spaceAfter=5
    )
    
    bullet = ParagraphStyle(
        'Bullet',
        parent=body,
        leftIndent=12,
        firstLineIndent=-8,
        spaceAfter=3
    )

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

    table_cell = ParagraphStyle(
        'TableCell',
        parent=styles['Normal'],
        fontName='Helvetica',
        fontSize=8,
        leading=11,
        textColor=colors.HexColor('#1E293B')
    )

    table_cell_bold = ParagraphStyle(
        'TableCellBold',
        parent=styles['Normal'],
        fontName='Helvetica-Bold',
        fontSize=8,
        leading=11,
        textColor=colors.HexColor('#0B2545')
    )

    story = []

    # Título do Relatório
    story.append(Paragraph("RELATÓRIO TÉCNICO: ANÁLISE COMPLETA DE ÁREA DE NAVEGAÇÃO", title_style))
    story.append(Paragraph("ENQUADRAMENTO REGULATÓRIO (NORMAM/DPC), HIDROGRAFIA, METEOROLOGIA E PARÂMETROS OPERACIONAIS", subtitle_style))
    story.append(HRFlowable(width="100%", thickness=1.5, color=colors.HexColor('#0B2545'), spaceAfter=10))

    # 1. OBJETIVO E ESCOPO
    story.append(Paragraph("1. Objetivo e Escopo", h1_sec))
    story.append(Paragraph(
        "Este parecer estabelece a análise técnica, hidrográfica e regulatória completa das <b>Áreas de Navegação</b> aplicáveis à travessia marítima partindo do Estado da <b>Bahia (BA)</b> com destino final no Estado do <b>Pará (PA)</b>, abrangendo todo o arco do litoral leste, nordeste e equatorial brasileiro, em estrita conformidade com as Normas da Autoridade Marítima para Embarcações de Esporte e/ou Recreio (NORMAM-211/DPC e NORMAM-212/DPC) e os compêndios da Diretoria de Hidrografia e Navegação (DHN).",
        body
    ))

    # 2. CLASSIFICAÇÃO NORMATIVA DAS ÁREAS DE NAVEGAÇÃO (NORMAM)
    story.append(Paragraph("2. Classificação Normativa das Áreas de Navegação (NORMAM)", h1_sec))
    story.append(Paragraph(
        "A legislação marítima brasileira divide as águas jurisdicionais em categorias funcionais com base no grau de abrigo, distância da costa e risco náutico:",
        body
    ))
    
    story.append(Paragraph("<b>A) Navegação em Mar Aberto:</b>", h2_sub))
    story.append(Paragraph("• <b>Costeira:</b> Realizada dentro dos limites de até <b>20 milhas náuticas (MN)</b> da linha de costa continental ou ilhas marítimas costeiras. Permite apoio rádio VHF costeiro e socorro marítimo com tempo de resposta intermediário.", bullet))
    story.append(Paragraph("• <b>Oceânica (Sem Limite de Afastamento):</b> Realizada além de <b>20 milhas náuticas</b> da costa. Trata-se de navegação em alto-mar sem limites geográficos, onde a embarcação deve ser autossuficiente para situações de emergência médica, controle de avarias, combate a incêndio e salvatagem.", bullet))

    story.append(Paragraph("<b>B) Navegação Interior:</b>", h2_sub))
    story.append(Paragraph("• <b>Área 1 (Águas Abrigadas):</b> Enseadas, baías protegidas, lagoas e represas onde não se verificam ondas de porte significativo ou condições marítimas adversas (ex.: interior da Baía de Todos-os-Santos).", bullet))
    story.append(Paragraph("• <b>Área 2 (Águas Parcialmente Abrigadas):</b> Estuários, barras de rios, áreas portuárias externas e grandes baías com forte influência de correntes de maré e ressaca (ex.: Baía de São Marcos/MA, Baía de Marajó/PA e Rio Pará).", bullet))

    # 3. ZONEAMENTO HIDROGRÁFICO E AMBIENTAL DO PERCURSO (BAHIA AO PARÁ)
    story.append(Paragraph("3. Zoneamento Hidrográfico e Oceanográfico do Percurso", h1_sec))
    story.append(Paragraph(
        "O trajeto entre a Bahia e o Pará perfaz aproximadamente <b>1.600 a 2.000 milhas náuticas</b> navegadas (conforme o traçado costeiro ou direto), dividindo-se em 4 setores geográficos distintos:",
        body
    ))

    setores_data = [
        [
            Paragraph("Setor Geográfico", table_header),
            Paragraph("Classificação NORMAM", table_header),
            Paragraph("Características Oceanográficas / Hidrográficas", table_header),
            Paragraph("Condições Críticas e Desafios", table_header)
        ],
        [
            Paragraph("<b>Setor 1: Litoral Leste</b><br/>Salvador/BA → Cabedelo/PB<br/>(BA, SE, AL, PE, PB)", table_cell_bold),
            Paragraph("Mar Aberto (Costeira ou Oceânica) + Interior (Saídas)", table_cell),
            Paragraph("• Plataforma continental estreita.<br/>• Corrente do Brasil e Alísios de SE.<br/>• Presença de recifes costeiros (Costa dos Corais).", table_cell),
            Paragraph("• Entrada e saída em barras com rebentação.<br/>• Respeito à isóbata de segurança fora dos recifes.", table_cell)
        ],
        [
            Paragraph("<b>Setor 2: A 'Esquina' do Brasil</b><br/>Natal/RN → Fortaleza/CE<br/>(RN, CE)", table_cell_bold),
            Paragraph("Mar Aberto (Costeira / Oceânica)", table_cell),
            Paragraph("• Cabo de São Roque e Ponta do Calcanhar.<br/>• Corrente Norte do Brasil (forte deriva para NW).<br/>• Aceleração de ventos Alísios.", table_cell),
            Paragraph("• Mar cruzado (vagas e vagalhões).<br/>• Aceleração de velocidade sobre o fundo devido à correnteza favorável.", table_cell)
        ],
        [
            Paragraph("<b>Setor 3: Costa Equatorial</b><br/>Delta do Parnaíba → São Luís<br/>(PI, MA)", table_cell_bold),
            Paragraph("Mar Aberto (Costeira) e Interior (Área 2)", table_cell),
            Paragraph("• Costa dos Lençóis e Golfão Maranhense.<br/>• Regime de <b>Macromaré</b> (variação de até 6 a 7 metros).<br/>• Bancos de areia e baixios móveis.", table_cell),
            Paragraph("• Navegação costeira perigosa perto de terra por assoreamento.<br/>• Fortíssimas correntes de maré em estuários.", table_cell)
        ],
        [
            Paragraph("<b>Setor 4: Estuário Amazônico</b><br/>Litoral do Pará → Belém<br/>(PA - Baía de Marajó / Rio Pará)", table_cell_bold),
            Paragraph("Navegação Interior (Área 2) / Águas Fluviais", table_cell),
            Paragraph("• Pluma estuarina do Rio Amazonas e Tocantins.<br/>• Transição de água salgada para doce/salobra.<br/>• Correntes fluviais/maré de 4 a 6 nós.", table_cell),
            Paragraph("• <b>Variação de calado:</b> Redução de empuxo na água doce.<br/>• Bancos de lama, troncos à deriva e ausência de balizamento noturno fino.", table_cell)
        ]
    ]

    t_setores = Table(setores_data, colWidths=[110, 100, 160, 162])
    t_setores.setStyle(TableStyle([
        ('BACKGROUND', (0, 0), (-1, 0), colors.HexColor('#0B2545')),
        ('ALIGN', (0, 0), (-1, -1), 'LEFT'),
        ('VALIGN', (0, 0), (-1, -1), 'TOP'),
        ('GRID', (0, 0), (-1, -1), 0.5, colors.HexColor('#CBD5E1')),
        ('ROWBACKGROUNDS', (0, 1), (-1, -1), [colors.HexColor('#F8FAFC'), colors.white]),
        ('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(t_setores)
    story.append(Spacer(1, 8))

    # 4. CONDICIONANTES FÍSICOS E METEOROLÓGICOS DA ÁREA
    story.append(Paragraph("4. Condicionantes Oceanográficos e Meteorológicos da Área", h1_sec))
    story.append(Paragraph("• <b>Regime de Ventos:</b> Predomínio dos ventos <b>Alísios de Sudeste (SE) e Leste (E)</b> ao longo do litoral oriental, infletindo para <b>Nordeste/Leste</b> na costa equatorial. No sentido Bahia → Pará, a navegação ocorre majoritariamente com vento em popa folgada ou través aberto, proporcionando condições favoráveis para veleiros.", bullet))
    story.append(Paragraph("• <b>Correntes de Superfície:</b> A <b>Corrente Norte do Brasil (CNB)</b> atua como uma esteira contínua em direção a Noroeste/Norte, com intensidades médias de 1,5 a mais de 3,0 nós na altura do Ceará, Maranhão e Pará, favorecendo a velocidade de cruzeiro.", bullet))
    story.append(Paragraph("• <b>Dinâmica de Marés e Densidade:</b> Transição crítica de <i>Micromaré</i> na Bahia (amplitude ~1,5 m a 2,5 m) para <i>Macromaré</i> no Maranhão e Pará (amplitudes de 5,0 m a 7,0 m). A variação da densidade da água (de 1,025 g/cm³ no oceano para ~1,000 g/cm³ nos rios paraenses) provoca um aumento no calado da embarcação de cerca de 2,5% a 3,0% pelo afundamento estático, fator determinante para transposição de barras fluviais.", bullet))

    # 5. QUADRO DE EXIGÊNCIAS POR ÁREA DE NAVEGAÇÃO
    story.append(Paragraph("5. Requisitos Regulamentares por Área de Navegação", h1_sec))
    
    req_data = [
        [
            Paragraph("Área de Navegação", table_header),
            Paragraph("Habilitação Exigida (NORMAM-211)", table_header),
            Paragraph("Dotação de Comunicação e Rádio", table_header),
            Paragraph("Dotação de Salvatagem Crítica", table_header)
        ],
        [
            Paragraph("<b>Mar Aberto - Oceânica</b><br/>(Fora de 20 MN)", table_cell_bold),
            Paragraph("<b>Capitão-Amador</b>", table_cell),
            Paragraph("• Rádio VHF com DSC fixo.<br/>• Rádio HF/SSB ou Terminal Satelital.<br/>• EPIRB 406 MHz obrigatório.", table_cell),
            Paragraph("• Balsa salva-vidas auto-inflável (classe oceânica para 100% dos tripulantes).<br/>• Pirotécnicos classe Mar Aberto completos.<br/>• Coletes salva-vidas Classe I homologados.", table_cell)
        ],
        [
            Paragraph("<b>Mar Aberto - Costeira</b><br/>(Até 20 MN)", table_cell_bold),
            Paragraph("<b>Mestre-Amador</b><br/>(ou Capitão-Amador)", table_cell),
            Paragraph("• Rádio VHF fixo com antena de mastro.<br/>• Rádio VHF portátil reserva.", table_cell),
            Paragraph("• Pirotécnicos classe Mar Aberto.<br/>• Coletes Classe II (ou Classe I).<br/>• Bóia circular com facho luminoso e retinida.", table_cell)
        ],
        [
            Paragraph("<b>Navegação Interior</b><br/>(Áreas 1 e 2)", table_cell_bold),
            Paragraph("<b>Arrais-Amador</b><br/>(ou Mestre/Capitão)", table_cell),
            Paragraph("• Rádio VHF fixo ou portátil.", table_cell),
            Paragraph("• Coletes salva-vidas Classe III (ou superior).<br/>• Pirotécnicos para navegação interior.", table_cell)
        ]
    ]

    t_req = Table(req_data, colWidths=[110, 110, 150, 162])
    t_req.setStyle(TableStyle([
        ('BACKGROUND', (0, 0), (-1, 0), colors.HexColor('#0B2545')),
        ('ALIGN', (0, 0), (-1, -1), 'LEFT'),
        ('VALIGN', (0, 0), (-1, -1), 'TOP'),
        ('GRID', (0, 0), (-1, -1), 0.5, colors.HexColor('#CBD5E1')),
        ('ROWBACKGROUNDS', (0, 1), (-1, -1), [colors.HexColor('#F8FAFC'), colors.white]),
        ('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(t_req)
    story.append(Spacer(1, 8))

    # 6. PARECER CONCLUSIVO SOBRE O ENQUADRAMENTO DA ÁREA
    story.append(Paragraph("6. Parecer Conclusivo e Enquadramento Oficial", h1_sec))
    story.append(Paragraph(
        "1. <b>Classificação Obrigatória de Registro:</b> Para a realização irrestrita e legal da viagem Bahia → Pará, a área de navegação atribuída à embarcação no seu TIE (Título de Inscrição de Embarcação) perante a Autoridade Marítima deve ser formalmente <b>MAR ABERTO (COSTEIRA OU OCEÂNICA)</b>.",
        bullet
    ))
    story.append(Paragraph(
        "2. <b>Estratégia de Navegação:</b> Caso o traçado da rota opte por pernas retas 'offshore' evitando os golfões e reentrâncias do Maranhão e Pará (afastando-se mais de 20 milhas náuticas da linha de base), a área passa compulsoriamente para <b>Mar Aberto - Oceânica</b>, exigindo comandante habilitado como Capitão-Amador e balsa salva-vidas homologada.",
        bullet
    ))
    story.append(Paragraph(
        "3. <b>Trechos Fluviais e Estuarinos:</b> As seções finais na Baía de Marajó e Rio Pará, embora enquadradas como Navegação Interior (Área 2), demandam cautela náutica superior a muitas áreas de mar aberto devido às correntes torrenciais e restrições de profundidade por assoreamento.",
        bullet
    ))

    doc.build(story, canvasmaker=NumberedCanvas)
    print("PDF da Análise Completa gerado em:", pdf_path)

if __name__ == "__main__":
    gerar_pdf_analise_completa()
