import os
import sys
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_number(num_pages)
            super(NumberedCanvas, self).showPage()
        super(NumberedCanvas, self).save()

    def draw_page_number(self, page_count):
        self.saveState()
        self.setFont("Helvetica", 9)
        self.setFillColor(colors.HexColor("#4A5568"))
        
        # Header (pages > 1)
        if self._pageNumber > 1:
            self.drawString(54, 800, "Brana Escola de Engenharia Naval | Estaleiro Escola Embrião (EEE)")
            self.drawRightString(541, 800, "Rebocador 17,5m Alumínio 5083 — Matheus Silva")
            self.setStrokeColor(colors.HexColor("#CBD5E0"))
            self.setLineWidth(0.5)
            self.line(54, 792, 541, 792)
            
        # Footer
        text = f"Página {self._pageNumber} de {page_count}"
        self.drawRightString(541, 36, text)
        self.drawString(54, 36, "Projeto Preliminar: Matheus Silva — Prof. Assistente: Magdalena (Mada)")
        self.setStrokeColor(colors.HexColor("#CBD5E0"))
        self.setLineWidth(0.5)
        self.line(54, 48, 541, 48)
        self.restoreState()

def build_pdf(filename):
    doc = SimpleDocTemplate(
        filename,
        pagesize=A4,
        leftMargin=54,
        rightMargin=54,
        topMargin=54,
        bottomMargin=54
    )

    styles = getSampleStyleSheet()
    
    primary_color = colors.HexColor("#0F3E6D")     # Azul Marítimo Escuro
    secondary_color = colors.HexColor("#1D70B8")   # Azul Marinho
    dark_neutral = colors.HexColor("#1A202C")
    light_bg = colors.HexColor("#F7FAFC")
    accent_color = colors.HexColor("#E65100")       # Laranja Naval / Trabalho

    title_style = ParagraphStyle(
        'DocTitle',
        parent=styles['Normal'],
        fontName='Helvetica-Bold',
        fontSize=20,
        leading=24,
        textColor=primary_color,
        spaceAfter=4
    )
    
    subtitle_style = ParagraphStyle(
        'DocSubTitle',
        parent=styles['Normal'],
        fontName='Helvetica',
        fontSize=11,
        leading=14,
        textColor=secondary_color,
        spaceAfter=10
    )

    h1_style = ParagraphStyle(
        'Heading1_Custom',
        parent=styles['Normal'],
        fontName='Helvetica-Bold',
        fontSize=13,
        leading=16,
        textColor=primary_color,
        spaceBefore=10,
        spaceAfter=5,
        keepWithNext=True
    )

    h2_style = ParagraphStyle(
        'Heading2_Custom',
        parent=styles['Normal'],
        fontName='Helvetica-Bold',
        fontSize=10.5,
        leading=13,
        textColor=secondary_color,
        spaceBefore=6,
        spaceAfter=3,
        keepWithNext=True
    )

    body_style = ParagraphStyle(
        'Body_Custom',
        parent=styles['Normal'],
        fontName='Helvetica',
        fontSize=9,
        leading=12.5,
        textColor=dark_neutral,
        spaceAfter=5
    )

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

    story = []

    # Title & Header
    story.append(Paragraph("RELATÓRIO DE PROJETO PRELIMINAR NAVAL", title_style))
    story.append(Paragraph("Rebocador Portuário e de Apoio Marítimo em Alumínio 5083-H111 (17,5 m / 1.000 BHP)", subtitle_style))
    story.append(HRFlowable(width="100%", thickness=2, color=accent_color, spaceAfter=8))

    # Meta Info Table
    meta_data = [
        [
            Paragraph("<b>Aluno:</b> Matheus Silva", body_style),
            Paragraph("<b>Orientação Técnica:</b> Profa. Magdalena (Mada)", body_style)
        ],
        [
            Paragraph("<b>Instituição:</b> Brana & Estaleiro Escola Embrião (EEE)", body_style),
            Paragraph("<b>Data de Emissão:</b> Setembro / 2026", body_style)
        ],
        [
            Paragraph("<b>Área de Operação:</b> Baía de Todos os Santos (BTS - Salvador / Aratu / Madre de Deus)", body_style),
            Paragraph("<b>Classificação NORMAM:</b> Navegação Interior (Área 1 / Área 2) + Apoio Portuário", body_style)
        ]
    ]
    t_meta = Table(meta_data, colWidths=[240, 240])
    t_meta.setStyle(TableStyle([
        ('BACKGROUND', (0,0), (-1,-1), light_bg),
        ('BOX', (0,0), (-1,-1), 0.5, colors.HexColor("#CBD5E0")),
        ('INNERGRID', (0,0), (-1,-1), 0.5, colors.HexColor("#E2E8F0")),
        ('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(t_meta)
    story.append(Spacer(1, 6))

    # 1. Caso de Uso e Missão Operacional
    story.append(Paragraph("1. Caso de Uso e Requisitos Operacionais", h1_style))
    story.append(Paragraph(
        "A embarcação destina-se a operações de <b>assistência a manobras de atracação/desatracação</b>, "
        "<b>reboque de chatas e barcaças de carga geral e combustíveis (até 5.000 DWT)</b>, e apoio logístico contínuo "
        "aos terminais industriais e portos da Baía de Todos os Santos. A operação exige prontidão 24/7 com regime de pernoite "
        "e acomodação plena para <b>4 a 6 tripulantes</b>.",
        body_style
    ))

    # 2. Dimensões Principais e Coeficientes Hidrodinâmicos
    story.append(Paragraph("2. Dimensões Principais, Hidrostática e Estabilidade", h1_style))
    
    dim_table_data = [
        [Paragraph("<b>Parâmetro Geométrico</b>", body_style), Paragraph("<b>Valor de Projeto</b>", body_style), Paragraph("<b>Parâmetro Operacional / Estabilidade</b>", body_style), Paragraph("<b>Valor Estimado</b>", body_style)],
        [Paragraph("Comprimento Total (LOA)", body_style), Paragraph("<b>17,50 m</b> (57,4 ft)", body_style), Paragraph("Deslocamento Carregado (Δ)", body_style), Paragraph("<b>78,0 toneladas</b>", body_style)],
        [Paragraph("Comprimento Linha d'Água (LWL)", body_style), Paragraph("<b>16,20 m</b>", body_style), Paragraph("Tração Estática (Bollard Pull)", body_style), Paragraph("<b>13,2 toneladas</b>", body_style)],
        [Paragraph("Boca Moldada (B)", body_style), Paragraph("<b>5,60 m</b>", body_style), Paragraph("Altura Metacêntrica (GMt)", body_style), Paragraph("<b>1,12 m</b> (Firme / IMO Compliant)", body_style)],
        [Paragraph("Pontal Moldado (D)", body_style), Paragraph("<b>3,00 m</b>", body_style), Paragraph("Velocidade de Deslocamento Livre", body_style), Paragraph("<b>10,5 nós</b>", body_style)],
        [Paragraph("Calado Operacional (T)", body_style), Paragraph("<b>2,35 m</b>", body_style), Paragraph("Potência Total Instalada", body_style), Paragraph("<b>1.000 BHP (2x 500 HP)</b>", body_style)],
        [Paragraph("Material do Casco / Estrutura", body_style), Paragraph("<b>Alumínio Naval 5083-H111</b>", body_style), Paragraph("Autonomia Operacional", body_style), Paragraph("<b>7 dias</b> (10.000 L Diesel)", body_style)]
    ]
    t_dim = Table(dim_table_data, colWidths=[130, 110, 130, 110])
    t_dim.setStyle(TableStyle([
        ('BACKGROUND', (0,0), (-1,0), primary_color),
        ('TEXTCOLOR', (0,0), (-1,0), colors.white),
        ('GRID', (0,0), (-1,-1), 0.5, colors.HexColor("#CBD5E0")),
        ('ROWBACKGROUNDS', (0,1), (-1,-1), [colors.white, light_bg]),
        ('TOPPADDING', (0,0), (-1,-1), 2.5),
        ('BOTTOMPADDING', (0,0), (-1,-1), 2.5),
    ]))
    story.append(t_dim)
    story.append(Spacer(1, 6))

    # 3. Propulsão e Cálculo do Bollard Pull
    story.append(Paragraph("3. Propulsão e Estimativa de Bollard Pull", h1_style))
    story.append(Paragraph(
        "A planta propulsora é constituída por <b>dois motores diesel de serviço pesado (2x 500 BHP @ 1800 rpm)</b> "
        "acoplados a reversores redutores de 4,5:1. Os eixos acionam dois hélices de 4 pás em bronze-alumínio de <b>1.450 mm de diâmetro</b>, "
        "enclausurados em <b>tubetes aceleradores Kort tipo 19A</b>.",
        body_style
    ))
    story.append(Paragraph("• <b>Fórmula de Projeto Adotada:</b> <i>BP = (BHP × 1,32) / 100 = 13,2 t</i> de tração contínua na bita.", bullet_style))
    story.append(Paragraph("• <b>Capacidade de Manobra:</b> Timões duplos de alta sustentação dispostos atrás de cada tubete Kort, garantindo resposta rápida em manobras portuárias.", bullet_style))

    # Page Break for Dimensioning Technical Drawing
    story.append(PageBreak())

    # 4. Desenho Técnico do Dimensionamento e Seção Mestra
    story.append(Paragraph("4. Perfil Longitudinal, Propulsão e Seção Mestra", h1_style))
    img_dim = "/home/magdalena/eee/alunos/matheus-silva/dimensionamento_rebocador.png"
    if os.path.exists(img_dim):
        story.append(RLImage(img_dim, width=490, height=360))
        story.append(Spacer(1, 8))

    story.append(Paragraph("<b>Escantilhonamento Estrutural em Alumínio Naval (Liga 5083-H111):</b>", h2_style))
    story.append(Paragraph("• <b>Fundo e Quilha:</b> Chapa de 12 mm de espessura com reforço duplo nas cavernas inferiores contra impactos.", bullet_style))
    story.append(Paragraph("• <b>Costado e Cintão:</b> Chapa de 10 mm com cinta de sacrifício de 12 mm na linha das defensas tipo pusher/cilíndricas.", bullet_style))
    story.append(Paragraph("• <b>Convés Principal & Base da Bita:</b> Chapa de 8 mm estruturada com inserto de 16 mm diretamente conectado às longarinas mestras.", bullet_style))
    story.append(Paragraph("• <b>Superestrutura (Passadiço):</b> Chapa de 4 a 5 mm para alívio de peso alto, garantindo centro de gravidade baixo (KG = 1,85 m).", bullet_style))

    # Page Break for Camarins & Accommodations
    story.append(PageBreak())

    # 5. Arranjo dos Camarins e Habitabilidade
    story.append(Paragraph("5. Arranjo Geral das Acomodações e Camarins (4 a 6 Tripulantes)", h1_style))
    story.append(Paragraph(
        "O arranjo interno foi dividido em dois níveis para garantir conforto térmico, isolamento sonoro rigoroso da praça de máquinas "
        "e funcionalidade de trabalho para operações de múltiplos turnos na Baía de Todos os Santos.",
        body_style
    ))

    img_cam = "/home/magdalena/eee/alunos/matheus-silva/arranjo_camarins_rebocador.png"
    if os.path.exists(img_cam):
        story.append(RLImage(img_cam, width=490, height=340))
        story.append(Spacer(1, 8))

    story.append(Paragraph("<b>Descrição dos Compartimentos:</b>", h2_style))
    story.append(Paragraph("• <b>Convés Inferior (Descanso):</b> Camarim do Comandante (1 leito largo + escrivaninha) a boreste; Camarim da Guarnição (2 beliches duplos / 4 leitos) a bombordo; Sanitário completo com chuveiro pressurizado; Antepara estrutural dupla acústica com lã de rocha de 50 mm.", bullet_style))
    story.append(Paragraph("• <b>Convés Principal (Serviço & Convivência):</b> Cozinha industrial em inox com fogão 4 bocas, freezer e pia dupla; Refeitório com mesa para 6 pessoas; Lavabo de convés para uso em serviço; Vestiário de botas/capas; Guincho de reboque e bita H na popa.", bullet_style))
    story.append(Paragraph("• <b>Passadiço Superior:</b> Comando 360° com visibilidade total do convés de trabalho de popa e da proa para manobras de empurre.", bullet_style))

    # Conclusão e Parecer
    story.append(Spacer(1, 10))
    story.append(Paragraph("6. Parecer Técnico da Professora Assistente", h1_style))
    story.append(Paragraph(
        "<i>\"O projeto do rebocador em alumínio naval 5083-H111 atende integralmente aos critérios de estabilidade severa da NORMAM-01/IMO "
        "(GMt = 1,12 m) e entrega uma capacidade de tração estática de 13,2 toneladas, tornando a embarcação extremamente versátil "
        "e competitiva para os serviços portuários e de apoio marítimo em toda a Baía de Todos os Santos.\"</i>",
        body_style
    ))

    doc.build(story, canvasmaker=NumberedCanvas)
    print("PDF Consolidado do Rebocador gerado com sucesso!")

if __name__ == "__main__":
    pdf_path = "/home/magdalena/eee/alunos/matheus-silva/Projeto_Rebocador_17m_Matheus_Silva.pdf"
    build_pdf(pdf_path)
