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")
            self.setFont("Helvetica", 8)
            self.setFillColor(colors.HexColor("#64748B"))
            self.drawRightString(541, 802, "Veleiro Motor-Sailer Alpha Centauri • Rota BA → MA")
            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: Alessandra Feitosa  •  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_relatorio_pdf():
    pdf_path = "/home/magdalena/eee/alunos/alessandra-feitosa/analise_navegacao_alpha_centauri_brana.pdf"
    img_path = "/home/magdalena/eee/alunos/alessandra-feitosa/alpha_centauri_desenho.jpg"
    
    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

    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=9.5,
        leading=13,
        textColor=c_secondary,
        spaceBefore=6,
        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
    )

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

    story = []

    # BANNER DE CABEÇALHO / IDENTIDADE VISUAL BRANA
    header_data = [
        [
            Paragraph("<b>BRANA</b><br/><font size=7 color='#64748B'>ESCOLA DE ENGENHARIA NAVAL</font>", ParagraphStyle('HLogo', fontName='Helvetica-Bold', fontSize=14, leading=15, textColor=c_primary)),
            Paragraph("<b>PARECER TÉCNICO DE ENGENHARIA NAVAL</b><br/><font size=8 color='#134074'>Estudo de Área de Navegação & Condições Hidro-meteorológicas</font>", ParagraphStyle('HTitle', fontName='Helvetica-Bold', fontSize=10, leading=13, textColor=c_secondary, alignment=2))
        ]
    ]
    t_header = Table(header_data, colWidths=[200, 287])
    t_header.setStyle(TableStyle([
        ('VALIGN', (0,0), (-1,-1), 'MIDDLE'),
        ('BOTTOMPADDING', (0,0), (-1,-1), 6),
    ]))
    story.append(t_header)
    story.append(HRFlowable(width="100%", thickness=2, color=c_primary, spaceBefore=0, spaceAfter=10))

    # METADADOS DO PROJETO
    meta_data = [
        [
            Paragraph("<b>Embarcação:</b> Veleiro Motor-Sailer <i>Alpha Centauri</i>", tbl_cell),
            Paragraph("<b>Projetista/Aluna:</b> Alessandra Feitosa", tbl_cell)
        ],
        [
            Paragraph("<b>Trecho de Navegação:</b> Salvador (BA) → São Luís (MA)", tbl_cell),
            Paragraph("<b>Extensão Aproximada:</b> ~1.350 Milhas Náuticas", tbl_cell)
        ],
        [
            Paragraph("<b>Regime de Propulsão:</b> Vela Mista + Motor Auxiliar (Motor-Sailer)", tbl_cell),
            Paragraph("<b>Enquadramento Normativo:</b> Mar Aberto (NORMAM-211/DPC)", tbl_cell)
        ]
    ]
    t_meta = Table(meta_data, colWidths=[243, 244])
    t_meta.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("#E2E8F0")),
        ('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(t_meta)
    story.append(Spacer(1, 8))

    # IMAGEM DO PROJETO SE EXISTIR
    if os.path.exists(img_path):
        img_table = [
            [
                RLImage(img_path, width=190, height=130),
                [
                    Paragraph("<b>Concepção Preliminar do Alpha Centauri</b>", h2_style),
                    Paragraph("• <b>Tipo:</b> Veleiro de Cruzeiro Monocasco (Deck Saloon / Pilothouse).", bullet_style),
                    Paragraph("• <b>Casco & Convés:</b> Borda livre pronunciada, cabine protegida, cockpit de popa com duplo posto e ampla área habitável.", bullet_style),
                    Paragraph("• <b>Plano Vélico:</b> Mastreação com múltiplos níveis de cruzetas e duplo estai de proa (vela de proa + estai de tempo).", bullet_style),
                    Paragraph("• <b>Vocação:</b> Perfeito para cruzeiros oceânicos e travessias com ventos de popa/alheta.", bullet_style),
                ]
            ]
        ]
        t_img = Table(img_table, colWidths=[200, 287])
        t_img.setStyle(TableStyle([
            ('VALIGN', (0,0), (-1,-1), 'TOP'),
            ('BACKGROUND', (0,0), (-1,-1), colors.HexColor("#F8FAFC")),
            ('BOX', (0,0), (-1,-1), 0.5, colors.HexColor("#E2E8F0")),
            ('TOPPADDING', (0,0), (-1,-1), 5),
            ('BOTTOMPADDING', (0,0), (-1,-1), 5),
            ('LEFTPADDING', (0,0), (-1,-1), 5),
            ('RIGHTPADDING', (0,0), (-1,-1), 5),
        ]))
        story.append(t_img)
        story.append(Spacer(1, 10))

    # 1. ENQUADRAMENTO DA ÁREA DE NAVEGAÇÃO
    story.append(Paragraph("1. Enquadramento e Classificação da Rota (NORMAM)", h1_style))
    story.append(Paragraph(
        "A rota ao longo da costa nordeste brasileira, partindo de Salvador (BA) em direção a São Luís (MA), compreende um percurso de mar aberto de aproximadamente 1.350 milhas náuticas. Nos termos da NORMAM-211/DPC:",
        body_style
    ))
    story.append(Paragraph("• <b>Classificação Obrigatória:</b> Navegação de <b>Mar Aberto</b>.", bullet_style))
    story.append(Paragraph("• <b>Submodalidade Recomendada: Oceânica (Sem limite de afastamento).</b> Embora a rota possa ser executada teoricamente dentro da faixa de <i>Navegação Costeira</i> (até 20 milhas náuticas da costa), o afastamento seguro de bancos de recifes (ex: recifes de Alagoas/Pernambuco e bancos dos Lençóis Maranhenses) impõe rotas que ultrapassam essa faixa para garantir margem de manobra e segurança náutica.", bullet_style))
    story.append(Paragraph("• <b>Dotação de Segurança:</b> A embarcação deverá dispor de balsa salva-vidas classe oceânica, EPIRB, rádio VHF fixo com DSC + comunicação satelital (Garmin InReach/Iridium), além de pirotécnicos e dotação médica completa.", bullet_style))

    story.append(Spacer(1, 6))

    # 2. DINÂMICA OCEANOGRÁFICA E METEOROLÓGICA
    story.append(Paragraph("2. Dinâmica de Ventos e Correntes Oceânicas", h1_style))
    story.append(Paragraph(
        "A costa do Nordeste é marcada por condições altamente favoráveis para a navegação no sentido Sul → Norte (subida), proporcionando excelente rendimento à vela e a motor:",
        body_style
    ))

    vento_tbl = [
        [Paragraph("Região / Setor", tbl_header), Paragraph("Ventos Predominantes", tbl_header), Paragraph("Corrente Marítima", tbl_header), Paragraph("Efeito na Navegação", tbl_header)],
        [
            Paragraph("<b>BA → SE / AL</b><br/>(Costa Leste)", tbl_cell),
            Paragraph("Alísios de E/SE (12 a 18 nós)", tbl_cell),
            Paragraph("Corrente do Brasil (Sul / Fraca)", tbl_cell),
            Paragraph("Velejada de través/alheta; mar favorável com ondulação de SE.", tbl_cell)
        ],
        [
            Paragraph("<b>PE → RN</b><br/>(Cabo Branco / Touros)", tbl_cell),
            Paragraph("Alísios de SE (15 a 22 nós)", tbl_cell),
            Paragraph("Bifurcação da Corrente Sul-Equatorial", tbl_cell),
            Paragraph("Zona de transição com mar mais batido na ponta do continente.", tbl_cell)
        ],
        [
            Paragraph("<b>CE → PI → MA</b><br/>(Costa Norte)", tbl_cell),
            Paragraph("Alísios de E/ENE (18 a 28 nós)", tbl_cell),
            Paragraph("Corrente Norte do Brasil (1,5 a 2,5 nós WNW)", tbl_cell),
            Paragraph("<b>Forte corrente a favor</b> e vento em popa rasa/alheta. Médias altas.", tbl_cell)
        ],
    ]
    t_vento = Table(vento_tbl, colWidths=[95, 125, 135, 132])
    t_vento.setStyle(TableStyle([
        ('BACKGROUND', (0,0), (-1,0), c_secondary),
        ('BOX', (0,0), (-1,-1), 0.5, colors.HexColor("#CBD5E1")),
        ('INNERGRID', (0,0), (-1,-1), 0.5, colors.HexColor("#E2E8F0")),
        ('VALIGN', (0,0), (-1,-1), 'TOP'),
        ('TOPPADDING', (0,0), (-1,-1), 3),
        ('BOTTOMPADDING', (0,0), (-1,-1), 3),
        ('LEFTPADDING', (0,0), (-1,-1), 4),
        ('RIGHTPADDING', (0,0), (-1,-1), 4),
    ]))
    story.append(t_vento)

    story.append(Spacer(1, 8))

    # 3. PECULIARIDADES CRÍTICAS E PONTOS DE ATENÇÃO
    story.append(Paragraph("3. Desafios Hidrográficos e Cuidados Operacionais", h1_style))
    
    story.append(Paragraph("<b>A. Costa dos Recifes (Alagoas a Paraíba):</b>", h2_style))
    story.append(Paragraph("Barreiras de recifes de arenito e corais paralelas à costa. Exige navegação fora da isobática de segurança (mínimo de 30 a 50 metros de profundidade) durante travessias noturnas, evitando aproximações sem cartas náuticas atualizadas e visibilidade plena.", body_style))

    story.append(Paragraph("<b>B. Tráfego Comercial no Cabo de São Roque e Calcanhar:</b>", h2_style))
    story.append(Paragraph("A 'esquina do Brasil' é rota obrigatória de navios mercantes e petroleiros que contornam o continente. Uso mandatório de AIS (transponder ativo), vigia permanente e radar em passagens noturnas.", body_style))

    story.append(Paragraph("<b>C. Macromarés e Estuários do Maranhão (O Grande Desafio):</b>", h2_style))
    story.append(Paragraph("A partir dos Lençóis Maranhenses e entrada do Golfão Maranhense (Baía de São Marcos / Baía de São José):", body_style))
    story.append(Paragraph("• <b>Amplitude de Maré:</b> Ultrapassa <b>6,5 a 7,0 metros</b> em marés de sizígia.", bullet_style))
    story.append(Paragraph("• <b>Correntes de Maré:</b> Podem atingir <b>4 a 6 nós</b> nos canais de entrada.", bullet_style))
    story.append(Paragraph("• <b>Bancos de Areia Dinâmicos:</b> Assoreamento constante e bancos de areia que mudam de posição após cada período de chuvas. Entrada em portos e fundeadouros deve ser feita <b>estritamente com maré enchente</b> e cálculo rigoroso da tábua de marés da DHN.", bullet_style))

    story.append(Spacer(1, 8))

    # 4. AVALIAÇÃO DA CONFIGURAÇÃO MOTOR-SAILER
    story.append(Paragraph("4. Comportamento e Vantagens do Motor-Sailer no Trecho", h1_style))
    story.append(Paragraph(
        "A escolha da tipologia <b>Motor-Sailer</b> para o <i>Alpha Centauri</i> é tecnicamente ideal para esta derrota pelos seguintes fatores:",
        body_style
    ))
    story.append(Paragraph("1. <b>Manobrabilidade sob Correnteza Severa:</b> O motor diesel com potência reforçada permite navegar e fundear com segurança contra as fortes correntes do Maranhão e Ceará.", bullet_style))
    story.append(Paragraph("2. <b>Conforto e Proteção no Mar Aberto:</b> A cabine estilo <i>Deck Saloon</i> com posto interno/protegido reduz drasticamente a fadiga da tripulação em travessias longas sob sol intenso e mares de través batido.", bullet_style))
    story.append(Paragraph("3. <b>Autonomia Combinada:</b> Possibilidade de usar vela de proa em regime de cruzeiro assistido a motor (*motorsailing*), reduzindo consumo de combustível e garantindo médias constantes de 7 a 9 nós.", bullet_style))

    story.append(Spacer(1, 10))

    # CONCLUSÃO E ASSINATURA
    concl_data = [
        [
            Paragraph("<b>PARECER CONCLUSIVO:</b> A área de navegação BA → MA oferece condições de vento e corrente amplamente favoráveis à navegação à vela e mista. O projeto do <i>Alpha Centauri</i> demonstra vocação natural para o trecho, exigindo especial atenção ao dimensionamento dos tanques de diesel/água doce e cálculo de marés para a aproximação final no Maranhão.", ParagraphStyle('Concl', parent=body_style, fontSize=8, leading=11, textColor=c_primary)),
        ]
    ]
    t_concl = Table(concl_data, colWidths=[487])
    t_concl.setStyle(TableStyle([
        ('BACKGROUND', (0,0), (-1,-1), colors.HexColor("#E0F2FE")),
        ('BOX', (0,0), (-1,-1), 1, c_accent),
        ('TOPPADDING', (0,0), (-1,-1), 6),
        ('BOTTOMPADDING', (0,0), (-1,-1), 6),
        ('LEFTPADDING', (0,0), (-1,-1), 8),
        ('RIGHTPADDING', (0,0), (-1,-1), 8),
    ]))
    story.append(t_concl)

    story.append(Spacer(1, 14))

    # Assinatura
    sign_data = [
        [
            Paragraph("<b>Magdalena (Mada), D.Sc.</b><br/><font size=7.5 color='#64748B'>Professora Assistente de Arquitetura Naval<br/>Brana Escola de Engenharia Naval / EEE</font>", ParagraphStyle('Sign1', fontName='Helvetica', fontSize=8.5, leading=11, alignment=0)),
            Paragraph("<b>Alessandra Feitosa</b><br/><font size=7.5 color='#64748B'>Aluna de Design Profissional de Embarcações<br/>Projeto Veleiro Alpha Centauri</font>", ParagraphStyle('Sign2', fontName='Helvetica', fontSize=8.5, leading=11, alignment=2))
        ]
    ]
    t_sign = Table(sign_data, colWidths=[243, 244])
    t_sign.setStyle(TableStyle([
        ('VALIGN', (0,0), (-1,-1), 'TOP'),
    ]))
    story.append(t_sign)

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

if __name__ == "__main__":
    gerar_relatorio_pdf()
