import os
import json
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 & ESTALEIRO ESCOLA EMBRIÃO")
            self.setFont("Helvetica", 8)
            self.setFillColor(colors.HexColor("#64748B"))
            self.drawRightString(541, 802, "Saveiro Costeiro Tradicional 7,00m • Caso de Uso e Requisitos")
            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, "Aluno: Antônio Manoel Costa (Grupo 4) • Orientação: Profa. 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_caso_de_uso_pdf():
    pdf_path = "/home/magdalena/eee/alunos/antonio-manoel-costa/Caso_de_Uso_Antonio_Manoel_Costa.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

    title_style = ParagraphStyle(
        'DocTitle',
        parent=styles['Normal'],
        fontName='Helvetica-Bold',
        fontSize=15,
        leading=19,
        textColor=c_primary,
        alignment=1,
        spaceAfter=3
    )

    subtitle_style = ParagraphStyle(
        'DocSubtitle',
        parent=styles['Normal'],
        fontName='Helvetica',
        fontSize=9.5,
        leading=13,
        textColor=c_secondary,
        alignment=1,
        spaceAfter=10
    )

    h1_style = ParagraphStyle(
        'Heading1_Custom',
        parent=styles['Normal'],
        fontName='Helvetica-Bold',
        fontSize=11,
        leading=14,
        textColor=c_primary,
        spaceBefore=9,
        spaceAfter=3,
        keepWithNext=True
    )

    h2_style = ParagraphStyle(
        'Heading2_Custom',
        parent=styles['Normal'],
        fontName='Helvetica-Bold',
        fontSize=9,
        leading=12,
        textColor=c_secondary,
        spaceBefore=5,
        spaceAfter=2,
        keepWithNext=True
    )

    body_style = ParagraphStyle(
        'Body_Custom',
        parent=styles['Normal'],
        fontName='Helvetica',
        fontSize=8.5,
        leading=11.5,
        textColor=c_dark,
        alignment=4,
        spaceAfter=4
    )

    bullet_style = ParagraphStyle(
        'Bullet_Custom',
        parent=body_style,
        leftIndent=12,
        firstLineIndent=-8,
        spaceAfter=2.5
    )

    table_header_style = ParagraphStyle(
        'TH_Style',
        parent=styles['Normal'],
        fontName='Helvetica-Bold',
        fontSize=8,
        leading=10,
        textColor=colors.white,
        alignment=1
    )

    table_body_style = ParagraphStyle(
        'TB_Style',
        parent=styles['Normal'],
        fontName='Helvetica',
        fontSize=8,
        leading=10,
        textColor=c_dark
    )

    elements = []

    # ==================== CABEÇALHO DO DOCUMENTO ====================
    elements.append(Paragraph("DOCUMENTO DE CASO DE USO E ESPECIFICAÇÃO DE REQUISITOS", title_style))
    elements.append(Paragraph("Metodologia de Projeto BRANA / Estaleiro Escola Embrião • Saveiro Costeiro 7,00 m", subtitle_style))
    elements.append(HRFlowable(width="100%", thickness=1.5, color=c_accent, spaceBefore=0, spaceAfter=8))

    # Tabela Resumo do Projeto
    meta_data = [
        [
            Paragraph("<b>Aluno / Projetista:</b> Antônio Manoel Costa", table_body_style),
            Paragraph("<b>Grupo:</b> Grupo 4 (EEE / Brana)", table_body_style),
            Paragraph("<b>Embarcação:</b> Saveiro Costeiro 7,00 m", table_body_style)
        ],
        [
            Paragraph("<b>Missão:</b> Lazer & Transporte de Passageiros", table_body_style),
            Paragraph("<b>Lotação:</b> 6 a 8 (típica) / até 12 pax", table_body_style),
            Paragraph("<b>Orçamento:</b> R$ 45.000,00 (Teto Otimizado)", table_body_style)
        ]
    ]
    meta_table = Table(meta_data, colWidths=[165, 155, 167])
    meta_table.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("#CBD5E1")),
        ('TOPPADDING', (0,0), (-1,-1), 4),
        ('BOTTOMPADDING', (0,0), (-1,-1), 4),
        ('LEFTPADDING', (0,0), (-1,-1), 6),
        ('RIGHTPADDING', (0,0), (-1,-1), 6),
    ]))
    elements.append(meta_table)
    elements.append(Spacer(1, 6))

    # ==================== 1. DECLARAÇÃO DE MISSÃO E PAPEL DO BARCO ====================
    elements.append(Paragraph("1. Declaração de Missão e Conceito Geral", h1_style))
    elements.append(Paragraph(
        "O projeto consiste na concepção de um <b>Saveiro Costeiro Tradicional de 7,00 m</b> para transporte de passageiros, passeios turísticos guiados e lazer contemplativo com amigos e familiares. A embarcação é orientada para o <b>conforto com estabilidade</b>, silêncio e segurança, preservando a identidade cultural dos saveiros de vela de içar da Bahia e garantindo um custo de construção rigorosamente controlado dentro de R$ 45.000,00.",
        body_style
    ))

    # ==================== 2. PERFIL DOS USUÁRIOS E ERGONOMIA ====================
    elements.append(Paragraph("2. Perfil dos Usuários e Diretrizes de Acessibilidade", h1_style))
    elements.append(Paragraph("<b>• Faixa Etária Ampla (6 a 70 anos):</b> Presença frequente de crianças e passageiros idosos, exigindo atenção especial à mobilidade reduzida correlacionada à idade.", bullet_style))
    elements.append(Paragraph("<b>• Estabilidade Inicial como Prioridade Nº 1:</b> Redução drástica do balanço/adernamento no embarque e movimentação a bordo, obtida pela boca generosa de 2,72 m e fundo com bojo firme.", bullet_style))
    elements.append(Paragraph("<b>• Circulação Segura:</b> Poço desimpedido com piso plano antiderrapante, ausência de degraus e borda interna com altura confortável de encosto e apoio.", bullet_style))

    # ==================== 3. PERFIL OPERACIONAL E ROTINA DE USO ====================
    elements.append(Paragraph("3. Perfil Operacional e Rotina de Uso", h1_style))
    
    t_oper_headers = [Paragraph("<b>Parâmetro Operacional</b>", table_header_style), Paragraph("<b>Especificação no Projeto</b>", table_header_style), Paragraph("<b>Impacto na Arquitetura Naval</b>", table_header_style)]
    t_oper_data = [
        t_oper_headers,
        [
            Paragraph("<b>Frequência de Uso</b>", table_body_style),
            Paragraph("60 dias por ano (fins de semana, feriados e alta temporada).", table_body_style),
            Paragraph("Construção robusta em madeira maciça com manutenção direta pelo proprietário.", table_body_style)
        ],
        [
            Paragraph("<b>Regime de Saída</b>", table_body_style),
            Paragraph("Passeios estritamente diurnos (sem pernoite).", table_body_style),
            Paragraph("Aproveitamento de 100% do comprimento interno para cockpit de convivência.", table_body_style)
        ],
        [
            Paragraph("<b>Lotação Redimensionada</b>", table_body_style),
            Paragraph("Média típica de 6 a 8 pessoas; Máxima de até 12 pessoas (10 passageiros + 2 tripulantes).", table_body_style),
            Paragraph("Capacidade ampliada pelo aumento do LOA para 7,00 m e Boca para 2,72 m.", table_body_style)
        ],
        [
            Paragraph("<b>Atividades Fundeado</b>", table_body_style),
            Paragraph("Banho de mar, mergulho e petiscar a bordo em ambiente calmo, sem música.", table_body_style),
            Paragraph("Escada de acesso reforçada, suportes para geleira/mesa e amplo toldo com proteção solar total.", table_body_style)
        ],
        [
            Paragraph("<b>Condução & Operação</b>", table_body_style),
            Paragraph("Majoritariamente marinheiro profissional contratado; eventualmente o proprietário.", table_body_style),
            Paragraph("Manobras de içar simplificadas e cana de leme direta com excelente resposta.", table_body_style)
        ]
    ]
    t_oper = Table(t_oper_data, colWidths=[110, 180, 197])
    t_oper.setStyle(TableStyle([
        ('BACKGROUND', (0,0), (-1,0), c_primary),
        ('VALIGN', (0,0), (-1,-1), 'MIDDLE'),
        ('GRID', (0,0), (-1,-1), 0.5, colors.HexColor("#CBD5E1")),
        ('ROWBACKGROUNDS', (0,1), (-1,-1), [colors.white, c_light_bg]),
        ('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),
    ]))
    elements.append(t_oper)
    elements.append(Spacer(1, 6))

    # ==================== 4. ÁREA DE NAVEGAÇÃO E RESTRIÇÕES ====================
    elements.append(Paragraph("4. Área de Navegação, Abrigo e Condições Ambientais", h1_style))
    elements.append(Paragraph("<b>• Base de Apoio:</b> Salvador/BA (casa em condomínio sem acesso ao mar). Embarcação guardada em poita, marina ou clube náutico.", bullet_style))
    elements.append(Paragraph("<b>• Área Principal e Extensão:</b> Saída da enseada da Z1 (Rio Vermelho), contorno da Barra e águas da BTS, com esticadas até Morro de São Paulo (~34 MN) sob tempo bom e mar calmo.", bullet_style))
    elements.append(Paragraph("<b>• Calado Adaptável:</b> Calado leve com bolina recolhida de <b>0,35 m</b> (para aproximação em praias e arrecifes) e <b>1,25 m</b> com bolina arriada (para orça à vela).", bullet_style))

    # ==================== PÁGINA 2 ====================
    elements.append(PageBreak())

    # ==================== 5. ITENS ESSENCIAIS DE CONFORTO E ARRANJO ====================
    elements.append(Paragraph("5. Requisitos de Conforto e Arranjo Geral", h1_style))
    
    itens_headers = [Paragraph("<b>Item / Subsistema</b>", table_header_style), Paragraph("<b>Descrição Funcional</b>", table_header_style), Paragraph("<b>Solução Construtiva no Barco de 7,00m</b>", table_header_style)]
    itens_data = [
        itens_headers,
        [
            Paragraph("<b>Toldo Amplo</b>", table_body_style),
            Paragraph("Proteção solar integral para passageiros e crianças durante os passeios e petiscos.", table_body_style),
            Paragraph("Bimini/toldo tradicional cobrindo todo o poço com lona impermeável e proteção UV.", table_body_style)
        ],
        [
            Paragraph("<b>Acesso à Água</b>", table_body_style),
            Paragraph("Escada de embarque/desembarque confortável para banho de mar e mergulho.", table_body_style),
            Paragraph("Escada rebatível em madeira maciça com pega-mão alto para apoio de crianças e idosos.", table_body_style)
        ],
        [
            Paragraph("<b>Área de Petiscos</b>", table_body_style),
            Paragraph("Espaço para refeições leves e confraternização silenciosa a bordo.", table_body_style),
            Paragraph("Bancos em U a ré com mesa central rebatível e geleiras térmicas embutidas sob os assentos.", table_body_style)
        ],
        [
            Paragraph("<b>Sanitário Químico</b>", table_body_style),
            Paragraph("Gabinete fechado a vante para uso emergencial durante as travessias.", table_body_style),
            Paragraph("Sanitário químico sob o convés de proa com ventilação natural.", table_body_style)
        ]
    ]
    t_itens = Table(itens_data, colWidths=[110, 185, 192])
    t_itens.setStyle(TableStyle([
        ('BACKGROUND', (0,0), (-1,0), c_secondary),
        ('VALIGN', (0,0), (-1,-1), 'MIDDLE'),
        ('GRID', (0,0), (-1,-1), 0.5, colors.HexColor("#CBD5E1")),
        ('ROWBACKGROUNDS', (0,1), (-1,-1), [colors.white, c_light_bg]),
        ('TOPPADDING', (0,0), (-1,-1), 4),
        ('BOTTOMPADDING', (0,0), (-1,-1), 4),
        ('LEFTPADDING', (0,0), (-1,-1), 5),
        ('RIGHTPADDING', (0,0), (-1,-1), 5),
    ]))
    elements.append(t_itens)
    elements.append(Spacer(1, 8))

    # ==================== 6. CONSTRUÇÃO, PROPULSÃO E ENGENHARIA DE CUSTO ====================
    elements.append(Paragraph("6. Construção Naval, Propulsão e Engenharia de Custo (R$ 45k)", h1_style))
    
    elements.append(Paragraph("<b>• Construtor Artesanal Tradicional:</b> Construção executada por Mestre Saveirista com mais de 40 anos de experiência (com histórico comprovado de saveiros de vela de içar de grande porte, até 60 m).", bullet_style))
    elements.append(Paragraph("<b>• Material Estrutural:</b> Madeira maciça tradicional regional (louro-canela, sucupira, jaqueira e pequiá), utilizando o saber tradicional do Estaleiro Escola.", bullet_style))
    elements.append(Paragraph("<b>• Propulsão Principal:</b> Armação tradicional de <b>vela de içar</b> baiana, priorizando conforto de marcha, torque em ventos fracos e estabilidade de rumo.", bullet_style))
    elements.append(Paragraph("<b>• Propulsão Auxiliar:</b> Motor de popa de <b>até 15 HP</b> (ou motor menor de 8 a 9,9 HP) instalado em suporte de espelho de popa para atracação, manobras e calmarias.", bullet_style))
    elements.append(Paragraph("<b>• Engenharia de Custo (Teto R$ 45.000,00):</b> Para viabilizar os 7,00 m no teto de R$ 45k, adota-se simplificação inteligente de ferragens de convés (madeira torneada e cabos sintéticos), cronograma financeiro de <b>R$ 15.000,00/mês em 3 meses</b> e <b>manutenção direta executada pelo próprio proprietário (orçamento de R$ 2.000,00/mês para insumos e poita)</b>.", bullet_style))

    # ==================== 7. MATRIZ DE DIMENSÕES PRINCIPAIS DERIVADAS ====================
    elements.append(Paragraph("7. Matriz de Dimensões Principais Redimensionadas (7,00 m)", h1_style))
    elements.append(Paragraph(
        "O redimensionamento proporcional a partir do modelo de 6,30 m resultou nas seguintes grandezas navais otimizadas:",
        body_style
    ))

    dim_headers = [Paragraph("<b>Grandeza Naval</b>", table_header_style), Paragraph("<b>Valor Redimensionado</b>", table_header_style), Paragraph("<b>Justificativa Técnica de Projeto</b>", table_header_style)]
    dim_data = [
        dim_headers,
        [Paragraph("<b>Comprimento Total (LOA)</b>", table_body_style), Paragraph("<b>7,00 m</b> (23,0 pés)", table_body_style), Paragraph("Aumento de comprimento amplia o poço para acomodar até 12 pessoas com excelente conforto.", table_body_style)],
        [Paragraph("<b>Boca Moldada (BOA)</b>", table_body_style), Paragraph("<b>2,72 m</b> (B/L = 0,39)", table_body_style), Paragraph("Ajuste proporcional que maximiza a estabilidade inicial para idosos e crianças.", table_body_style)],
        [Paragraph("<b>Pontal Moldado (D)</b>", table_body_style), Paragraph("<b>1,05 m</b>", table_body_style), Paragraph("Aumento proporcional da borda livre para segurança em vagas de mar aberto costeiro.", table_body_style)],
        [Paragraph("<b>Calado Leve (T_leve)</b>", table_body_style), Paragraph("<b>0,35 m</b> (sem bolina)", table_body_style), Paragraph("Preserva a capacidade de aproximação em praias e arrecifes rasos da Z1.", table_body_style)],
        [Paragraph("<b>Calado Máximo (T_bolina)</b>", table_body_style), Paragraph("<b>1,25 m</b> (com bolina)", table_body_style), Paragraph("Área antideriva generosa garantindo excelente ângulo de orça na BTS.", table_body_style)],
        [Paragraph("<b>Lotação Homologada</b>", table_body_style), Paragraph("<b>10 a 12 pessoas</b>", table_body_style), Paragraph("10 passageiros + 2 tripulantes (ou 12 passageiros em navegação abrigada).", table_body_style)]
    ]
    t_dim = Table(dim_data, colWidths=[130, 110, 247])
    t_dim.setStyle(TableStyle([
        ('BACKGROUND', (0,0), (-1,0), c_primary),
        ('VALIGN', (0,0), (-1,-1), 'MIDDLE'),
        ('GRID', (0,0), (-1,-1), 0.5, colors.HexColor("#CBD5E1")),
        ('ROWBACKGROUNDS', (0,1), (-1,-1), [colors.white, c_light_bg]),
        ('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),
    ]))
    elements.append(t_dim)
    elements.append(Spacer(1, 8))

    elements.append(Paragraph("8. Conclusão e Próximos Passos de Projeto", h1_style))
    elements.append(Paragraph(
        "Com a aprovação desta revisão, o projeto passa a contar com um <b>Saveiro de 7,00 m</b> mais estável, mais espaçoso e com excelente custo-benefício. Próxima etapa: <b>Estudo de Similares e Tabela de Cotas 3D do Casco de 7,00 m</b>.",
        body_style
    ))

    doc.build(elements, canvasmaker=NumberedCanvas)
    print("PDF de Caso de Uso 7,00m gerado com sucesso em:", pdf_path)

if __name__ == "__main__":
    gerar_caso_de_uso_pdf()
