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
)
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, "Documento de Requisitos: Caso de Uso — Catamarã de Expedição Nordeste")
            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_pdf_caso_de_uso():
    pdf_path = "/home/magdalena/eee/alunos/alessandra-feitosa/caso_de_uso_catamara_expedicao_brana.pdf"
    
    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(
        'H1',
        parent=styles['Normal'],
        fontName='Helvetica-Bold',
        fontSize=12,
        leading=15,
        textColor=c_primary,
        spaceBefore=12,
        spaceAfter=5,
        keepWithNext=True
    )

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

    body_style = ParagraphStyle(
        'Body',
        parent=styles['Normal'],
        fontName='Helvetica',
        fontSize=9,
        leading=13,
        textColor=c_dark,
        spaceAfter=5
    )

    bullet_style = ParagraphStyle(
        'Bullet',
        parent=body_style,
        leftIndent=14,
        firstLineIndent=-10,
        spaceAfter=3
    )

    tbl_header = ParagraphStyle(
        'TH',
        parent=styles['Normal'],
        fontName='Helvetica-Bold',
        fontSize=8,
        leading=10,
        textColor=colors.white
    )

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

    story = []

    # BANNER DE CABEÇALHO / 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>CASO DE USO & ESPECIFICAÇÃO DE REQUISITOS</b><br/><font size=8 color='#134074'>Projeto Preliminar: Catamarã de Expedição Nordeste (BA → MA)</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))

    # QUADRO RESUMO DO PROJETO
    resumo_data = [
        [
            Paragraph("<b>Projeto:</b> Catamarã de Expedição Oceânica", tbl_cell),
            Paragraph("<b>Projetista/Aluna:</b> Alessandra Feitosa", tbl_cell)
        ],
        [
            Paragraph("<b>Missão:</b> Cruzeiro de Longo Curso & Habitação", tbl_cell),
            Paragraph("<b>Lotação em Pernoite:</b> 10 Pessoas (5 Cabines)", tbl_cell)
        ],
        [
            Paragraph("<b>Área Operacional:</b> Costa do Nordeste (BA → MA)", tbl_cell),
            Paragraph("<b>Autonomia Alvo:</b> 500 MN / 10 a 15 dias sem apoio", tbl_cell)
        ],
        [
            Paragraph("<b>Comprimento Estimado (LOA):</b> 46 a 50 pés (~14 a 15 m)", tbl_cell),
            Paragraph("<b>Enquadramento:</b> Mar Aberto (NORMAM-211/DPC)", tbl_cell)
        ]
    ]
    t_resumo = Table(resumo_data, colWidths=[243, 244])
    t_resumo.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_resumo)
    story.append(Spacer(1, 10))

    # 1. PERFIL DE MISSÃO E OBJETIVOS GERAIS
    story.append(Paragraph("1. Definição da Missão & Caso de Uso Principal", h1_style))
    story.append(Paragraph(
        "O presente documento estabelece as bases conceituais, operacionais e de engenharia para o desenvolvimento de uma embarcação multicasco (Catamarã) destinada à navegação de expedição, cruzeiro de longa permanência e moradia a bordo para grupos de até 10 passageiros com total autonomia.",
        body_style
    ))
    story.append(Paragraph("• <b>Propósito Primário:</b> Travessia de longa distância ao longo da costa setentrional e oriental do Brasil, com capacidade de exploração de estuários, rios navegáveis, deltas e áreas isoladas sem suporte de infraestrutura náutica.", bullet_style))
    story.append(Paragraph("• <b>Regime de Permanência:</b> Embarcação projetada para habitação contínua por períodos de 15 a 30 dias em fundeios isolados, exigindo elevado grau de autossuficiência energética, dessalinização de água e armazenamento frigorífico.", bullet_style))
    story.append(Paragraph("• <b>Apoio & Desembarque:</b> Operação contínua de bote de apoio inflável semirrígido (RIB) motorizado para transbordo seguro de 10 pessoas, bagagens e suprimentos entre a embarcação e a terra.", bullet_style))

    story.append(Spacer(1, 6))

    # 2. ÁREA DE NAVEGAÇÃO E RESTRIÇÕES AMBIENTAIS
    story.append(Paragraph("2. Área de Navegação & Restrições Hidrográficas", h1_style))
    story.append(Paragraph(
        "A rota padrão estabelecida compreende o litoral da Bahia até o Maranhão (~1.350 MN), impondo restrições de projeto fundamentais:",
        body_style
    ))

    restricoes_data = [
        [Paragraph("Região / Ponto Crítico", tbl_header), Paragraph("Condição Ambiental", tbl_header), Paragraph("Impacto Direto no Projeto Naval", tbl_header)],
        [
            Paragraph("<b>Delta do Parnaíba (PI) & Lençóis (MA)</b>", tbl_cell),
            Paragraph("Bancos de areia móveis, barras rasas e calado restrito.", tbl_cell),
            Paragraph("<b>Calado máximo T &le; 1,10 - 1,20 m</b>. Casco apto a varar (encalhe controlado na areia).", tbl_cell)
        ],
        [
            Paragraph("<b>Golfão Maranhense (MA)</b>", tbl_cell),
            Paragraph("Macromarés (amplitude > 6,5 m) e correntes de 4 a 6 nós.", tbl_cell),
            Paragraph("Propulsão motorizada potente; sistema de fundeio superdimensionado.", tbl_cell)
        ],
        [
            Paragraph("<b>Costa dos Recifes (AL, PE, PB)</b>", tbl_cell),
            Paragraph("Barreiras de arenito/coral paralelas à costa.", tbl_cell),
            Paragraph("Casco com reforço estrutural de fundo e redundância de sensores de profundidade.", tbl_cell)
        ],
        [
            Paragraph("<b>Costa Norte (RN &rarr; MA)</b>", tbl_cell),
            Paragraph("Ventos Alísios fortes de popa/alheta (18 a 28 nós).", tbl_cell),
            Paragraph("Excelente estabilidade direcional e plano vélico adaptado para vento a favor.", tbl_cell)
        ],
    ]
    t_restr = Table(restricoes_data, colWidths=[120, 160, 207])
    t_restr.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), 4),
        ('BOTTOMPADDING', (0,0), (-1,-1), 4),
        ('LEFTPADDING', (0,0), (-1,-1), 5),
        ('RIGHTPADDING', (0,0), (-1,-1), 5),
    ]))
    story.append(t_restr)

    story.append(Spacer(1, 8))

    # 3. PROGRAMA DE NECESSIDADES & HABITABILIDADE
    story.append(Paragraph("3. Programa de Necessidades & Habitabilidade (10 Pessoas)", h1_style))
    story.append(Paragraph(
        "Acomodar 10 pessoas em pernoite de expedição requer divisão criteriosa de espaços e isolamento acústico:",
        body_style
    ))
    story.append(Paragraph("• <b>Arranjo de Cabines:</b> 4 a 5 cabines duplas distribuídas nos bordos (casco de boreste e bombordo), garantindo suítes com banheiros privativos ou semi-privativos e armários volumosos para bagagens pesadas de longa duração.", bullet_style))
    story.append(Paragraph("• <b>Salão Central & Cozinha (Deck Superior):</b> Cozinha náutica completa equipada com fogão a gás/indução de 3-4 bocas, forno, 2 geladeiras e 1 freezer profundo. Mesa de refeições interna e integração contínua (*flush deck*) com o cockpit de popa.", bullet_style))
    story.append(Paragraph("• <b>Ventilação & Conforto Térmico:</b> Vigias estrategicamente posicionadas para fluxo de ar cruzado (essencial no clima tropical) e isolamento térmico reforçado no teto da cabine e conveses.", bullet_style))

    story.append(Spacer(1, 6))

    # 4. BALANÇO DE AUTONOMIA & SISTEMAS
    story.append(Paragraph("4. Balanço Preliminar de Autonomia & Sistemas Críticos", h1_style))

    sistemas_data = [
        [Paragraph("Sistema / Recurso", tbl_header), Paragraph("Demanda / Parâmetro", tbl_header), Paragraph("Solução de Engenharia Proposta", tbl_header)],
        [
            Paragraph("<b>Combustível (Diesel)</b>", tbl_cell),
            Paragraph("Autonomia de 500 MN a 7,5 nós (~67 horas de motor)", tbl_cell),
            Paragraph("Tanques estruturais duplos totalizando <b>1.000 a 1.200 L</b> (500-600 L por casco).", tbl_cell)
        ],
        [
            Paragraph("<b>Água Doce</b>", tbl_cell),
            Paragraph("350 L/dia (10 pessoas @ 35 L/dia)", tbl_cell),
            Paragraph("Tanques de água doce (800 L) + <b>Dessalinizador por Osmose Reversa de 100-140 L/h</b>.", tbl_cell)
        ],
        [
            Paragraph("<b>Energia Elétrica</b>", tbl_cell),
            Paragraph("Cozinha, refrigeração, dessalinizador, eletrônica e bombas", tbl_cell),
            Paragraph("Teto rígido solar (1.800 W a 2.400 Wp) + Banco LiFePO4 24V de 800 Ah + Inversor 5 kW.", tbl_cell)
        ],
        [
            Paragraph("<b>Bote de Apoio (RIB)</b>", tbl_cell),
            Paragraph("Desembarque de grupo em praias com arrebentação", tbl_cell),
            Paragraph("Bote semirrígido de 3,60 m com motor 20-25 HP em turco de popa reforçado / plataforma.", tbl_cell)
        ],
    ]
    t_sist = Table(sistemas_data, colWidths=[110, 160, 217])
    t_sist.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), 4),
        ('BOTTOMPADDING', (0,0), (-1,-1), 4),
        ('LEFTPADDING', (0,0), (-1,-1), 5),
        ('RIGHTPADDING', (0,0), (-1,-1), 5),
    ]))
    story.append(t_sist)

    story.append(Spacer(1, 8))

    # 5. MATERIAIS & DIMENSIONAMENTO PRELIMINAR
    story.append(Paragraph("5. Comparativo Construtivo & Estimativa de Dimensões", h1_style))
    story.append(Paragraph(
        "Para conciliar a capacidade de 10 pessoas, volume de carga e calado raso, os parâmetros geométricos preliminares recomendados são:",
        body_style
    ))
    story.append(Paragraph("• <b>Comprimento de Fora a Fora (LOA):</b> 14,30 m a 15,20 m (47 a 50 pés).", bullet_style))
    story.append(Paragraph("• <b>Boca Total (B):</b> 7,60 m a 8,20 m (proporção B/L &asymp; 0,52 a 0,55 para estabilidade transversal elevada).", bullet_style))
    story.append(Paragraph("• <b>Calado Máximo de Projeto (T):</b> 1,05 m a 1,15 m (com quilhas sacrificiais de proteção).", bullet_style))
    story.append(Paragraph("• <b>Deslocamento Leve Estimado:</b> 12,5 a 14,0 toneladas | <b>Deslocamento Carregado (&Delta;):</b> 17,5 a 19,5 toneladas.", bullet_style))
    story.append(Paragraph("• <b>Trade-off de Material:</b> O <b>Alumínio Naval (5083-H111)</b> oferece imunidade a furos por contato em bancos de areia e permite varar em praias do Delta/Lençóis com total tranquilidade; a <b>Fibra de Vidro por Infusão a Vácuo</b> confere 15% a menos de peso, resultando em menor resistência hidrodinâmica.", bullet_style))

    story.append(Spacer(1, 10))

    # CONCLUSÃO E PRÓXIMA FASE
    concl_data = [
        [
            Paragraph("<b>PRÓXIMOS PASSOS DE ENGENHARIA (FASE 2):</b> Com o Caso de Uso aprovado, o projeto avança para a modelagem geométrica dos cascos (*Plano de Linhas*), determinação das curvas hidrostáticas, distribuição de pesos e centros (LCG/VCG) e validação dos critérios de estabilidade intacta conforme a NORMAM-211.", 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))

    # Assinaturas
    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 Catamarã de Expedição Nordeste</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 de Caso de Uso gerado com sucesso em:", pdf_path)

if __name__ == "__main__":
    gerar_pdf_caso_de_uso()
