import json
from pathlib import Path
from PIL import Image
from reportlab.lib.pagesizes import letter
from reportlab.lib import colors
from reportlab.platypus import (
    SimpleDocTemplate, Paragraph, Spacer, Table, TableStyle, PageBreak, KeepTogether, Image as RLImage
)
from reportlab.lib.styles import getSampleStyleSheet, ParagraphStyle
from reportlab.pdfgen import canvas

pdf_path = "/home/magdalena/eee/alunos/victor-lei/Arranjos_Gerais_Victor_Lei.pdf"
pdf_path_alt = "/home/magdalena/eee/alunos/victor-lei/Arranjos_de_Similares_Victor_Lei.pdf"

class NumberedCanvas(canvas.Canvas):
    def __init__(self, *args, **kwargs):
        super().__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_elements(num_pages)
            super().showPage()
        super().save()

    def draw_page_elements(self, page_count):
        self.saveState()
        self.setFont("Helvetica", 8)
        self.setFillColor(colors.HexColor("#718096"))
        
        # Header (página 2+)
        if self._pageNumber > 1:
            self.drawString(54, 750, "BRANA PROJETOS NAVAIS — LEVANTAMENTO DE ARRANJOS DE SIMILARES")
            self.drawRightString(612 - 54, 750, "PROJETISTA: VICTOR LEI")
            self.setStrokeColor(colors.HexColor("#E2E8F0"))
            self.setLineWidth(0.5)
            self.line(54, 742, 612 - 54, 742)
        
        # Footer
        self.setStrokeColor(colors.HexColor("#CBD5E0"))
        self.setLineWidth(0.5)
        self.line(54, 45, 612 - 54, 45)
        self.drawString(54, 32, "Brana · Escola de Arquitetura e Engenharia Naval | Estaleiro Escola Embrião (EEE)")
        self.drawRightString(612 - 54, 32, f"Página {self._pageNumber} de {page_count}")
        self.restoreState()

doc = SimpleDocTemplate(
    pdf_path,
    pagesize=letter,
    leftMargin=54,
    rightMargin=54,
    topMargin=54,
    bottomMargin=54
)

styles = getSampleStyleSheet()

cor_primaria = colors.HexColor("#1A365D")   # Azul Marinho Brana
cor_secundaria = colors.HexColor("#2B6CB0") # Azul Médio
cor_fundo_tabela = colors.HexColor("#F7FAFC")
cor_borda = colors.HexColor("#CBD5E0")
cor_destaque = colors.HexColor("#2C5282")

style_titulo = ParagraphStyle(
    'DocTitle',
    parent=styles['Normal'],
    fontName='Helvetica-Bold',
    fontSize=20,
    leading=24,
    textColor=cor_primaria,
    spaceAfter=4
)

style_subtitulo = ParagraphStyle(
    'DocSubTitle',
    parent=styles['Normal'],
    fontName='Helvetica-Bold',
    fontSize=11,
    leading=14,
    textColor=cor_secundaria,
    spaceAfter=14
)

style_secao_titulo = ParagraphStyle(
    'SectionHeading',
    parent=styles['Normal'],
    fontName='Helvetica-Bold',
    fontSize=11,
    leading=14,
    textColor=colors.white,
    spaceBefore=0,
    spaceAfter=0
)

style_corpo = ParagraphStyle(
    'BodyDark',
    parent=styles['Normal'],
    fontName='Helvetica',
    fontSize=8.5,
    leading=12,
    textColor=colors.HexColor("#2D3748")
)

style_legenda = ParagraphStyle(
    'Legenda',
    parent=styles['Normal'],
    fontName='Helvetica-Oblique',
    fontSize=8,
    leading=11,
    textColor=colors.HexColor("#4A5568")
)

# Processar / redimensionar imagens mantendo proporção para caber na página (max width 490, max height 280)
def process_img(img_path, target_path, max_w=490, max_h=260):
    im = Image.open(img_path)
    # Se for screenshot de celular, podemos cortar margens se necessário ou redimensionar direto
    w, h = im.size
    ratio = min(max_w / w, max_h / h)
    new_w = int(w * ratio)
    new_h = int(h * ratio)
    return new_w, new_h

story = []

# Título Principal
story.append(Paragraph("ARRANJOS GERAIS DE EMBARCAÇÕES SIMILARES", style_titulo))
story.append(Paragraph("Projeto: Lancha Clássica 16 Pés &nbsp;|&nbsp; Projetista: <b>Victor Lei</b> &nbsp;|&nbsp; Data: 16/09/2026", style_subtitulo))

intro_text = (
    "<b>Apresentação do Levantamento:</b> O estudo de arranjos gerais (plantas baixas e layouts de convés) "
    "de embarcações similares consolida as melhores soluções de ergonomia, circulação, distribuição de pesos e "
    "aproveitamento de espaço para lanchas clássicas cabinadas de 15 a 17 pés em madeira e compensado naval. "
    "Abaixo estão os layouts de referência dos projetos clássicos analisados."
)
t_intro = Table([[Paragraph(intro_text, style_corpo)]], colWidths=[504])
t_intro.setStyle(TableStyle([
    ('BACKGROUND', (0,0), (-1,-1), colors.HexColor("#EDF2F7")),
    ('BOX', (0,0), (-1,-1), 1, colors.HexColor("#CBD5E0")),
    ('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_intro)
story.append(Spacer(1, 10))

# 1. Glen-L 16 Cabin Skiff
t_h1 = Table([[Paragraph("1. GLEN-L 16 CABIN SKIFF (TABLOID CRUISER — 16' 3\" / 4,95 M)", style_secao_titulo)]], colWidths=[504])
t_h1.setStyle(TableStyle([
    ('BACKGROUND', (0,0), (-1,-1), cor_primaria),
    ('TOPPADDING', (0,0), (-1,-1), 4),
    ('BOTTOMPADDING', (0,0), (-1,-1), 4),
    ('LEFTPADDING', (0,0), (-1,-1), 8),
]))
story.append(t_h1)

img1_w, img1_h = process_img("/home/magdalena/eee/alunos/victor-lei/layout_cabin_skiff_16.jpg", "", max_w=480, max_h=230)
img1 = RLImage("/home/magdalena/eee/alunos/victor-lei/layout_cabin_skiff_16.jpg", width=img1_w, height=img1_h)

desc1 = (
    "<b>Características do Arranjo:</b> Cabine de proa compacta com leito em 'V' acolchoado para 2 adultos, "
    "posto de pilotagem a boreste com volante e comando a distância, bancos laterais longitudinais no cockpit, "
    "corredor central livre para circulação e área de popa desimpedida para motor de popa."
)
t_box1 = Table([[img1], [Paragraph(desc1, style_corpo)]], colWidths=[504])
t_box1.setStyle(TableStyle([
    ('ALIGN', (0,0), (-1,0), 'CENTER'),
    ('BACKGROUND', (0,0), (-1,-1), colors.white),
    ('BOX', (0,0), (-1,-1), 0.5, cor_borda),
    ('TOPPADDING', (0,0), (-1,-1), 5),
    ('BOTTOMPADDING', (0,0), (-1,-1), 5),
    ('LEFTPADDING', (0,0), (-1,-1), 8),
    ('RIGHTPADDING', (0,0), (-1,-1), 8),
]))
story.append(t_box1)
story.append(Spacer(1, 14))

story.append(PageBreak())

# 2. Glen-L 15 Cruisette
t_h2 = Table([[Paragraph("2. GLEN-L 15 CRUISETTE (MINI-CRUISER — 15' 0\" / 4,57 M)", style_secao_titulo)]], colWidths=[504])
t_h2.setStyle(TableStyle([
    ('BACKGROUND', (0,0), (-1,-1), cor_primaria),
    ('TOPPADDING', (0,0), (-1,-1), 4),
    ('BOTTOMPADDING', (0,0), (-1,-1), 4),
    ('LEFTPADDING', (0,0), (-1,-1), 8),
]))
story.append(t_h2)

img2_w, img2_h = process_img("/home/magdalena/eee/alunos/victor-lei/layout_cruisette_15.jpg", "", max_w=480, max_h=240)
img2 = RLImage("/home/magdalena/eee/alunos/victor-lei/layout_cruisette_15.jpg", width=img2_w, height=img2_h)

desc2 = (
    "<b>Características do Arranjo:</b> Minicruzeiro clássico de 15 pés com cabine de proa fechada (dois leitos de 6 pés com paióis sob os assentos), "
    "degrau central de acesso, posto de comando à meia-nau (Helm) com assento dobrável, piso central removível no cockpit e bancos de popa com espaço para tanque de combustível."
)
t_box2 = Table([[img2], [Paragraph(desc2, style_corpo)]], colWidths=[504])
t_box2.setStyle(TableStyle([
    ('ALIGN', (0,0), (-1,0), 'CENTER'),
    ('BACKGROUND', (0,0), (-1,-1), colors.white),
    ('BOX', (0,0), (-1,-1), 0.5, cor_borda),
    ('TOPPADDING', (0,0), (-1,-1), 5),
    ('BOTTOMPADDING', (0,0), (-1,-1), 5),
    ('LEFTPADDING', (0,0), (-1,-1), 8),
    ('RIGHTPADDING', (0,0), (-1,-1), 8),
]))
story.append(t_box2)
story.append(Spacer(1, 14))

# 3. Glen-L 17 Sea-Knight
t_h3 = Table([[Paragraph("3. GLEN-L 17 SEA-KNIGHT (OUTBOARD CRUISER — 17' 0\" / 5,18 M)", style_secao_titulo)]], colWidths=[504])
t_h3.setStyle(TableStyle([
    ('BACKGROUND', (0,0), (-1,-1), cor_primaria),
    ('TOPPADDING', (0,0), (-1,-1), 4),
    ('BOTTOMPADDING', (0,0), (-1,-1), 4),
    ('LEFTPADDING', (0,0), (-1,-1), 8),
]))
story.append(t_h3)

img3_w, img3_h = process_img("/home/magdalena/eee/alunos/victor-lei/layout_sea_knight_17.jpg", "", max_w=480, max_h=240)
img3 = RLImage("/home/magdalena/eee/alunos/victor-lei/layout_sea_knight_17.jpg", width=img3_w, height=img3_h)

desc3 = (
    "<b>Características do Arranjo:</b> Lancha cabinada completa com leitos em V na proa, tanque de água doce sob a cama (15 galões), "
    "gaiúta de ventilação no teto (15\"x18\"), nicho para sanitário privativo (W.C.), pia compacta (Sink), posto de comando e amplo cockpit nivelado (Flush Deck) com paióis para bateria e combustível."
)
t_box3 = Table([[img3], [Paragraph(desc3, style_corpo)]], colWidths=[504])
t_box3.setStyle(TableStyle([
    ('ALIGN', (0,0), (-1,0), 'CENTER'),
    ('BACKGROUND', (0,0), (-1,-1), colors.white),
    ('BOX', (0,0), (-1,-1), 0.5, cor_borda),
    ('TOPPADDING', (0,0), (-1,-1), 5),
    ('BOTTOMPADDING', (0,0), (-1,-1), 5),
    ('LEFTPADDING', (0,0), (-1,-1), 8),
    ('RIGHTPADDING', (0,0), (-1,-1), 8),
]))
story.append(t_box3)
story.append(Spacer(1, 14))

# 4. Síntese e Aplicação no Projeto de 16 Pés de Victor Lei
story.append(PageBreak())
t_h4 = Table([[Paragraph("4. SÍNTESE DO ARRANJO GERAL RECOMENDADO PARA A LANCHA DE 16 PÉS (VICTOR LEI)", style_secao_titulo)]], colWidths=[504])
t_h4.setStyle(TableStyle([
    ('BACKGROUND', (0,0), (-1,-1), cor_primaria),
    ('TOPPADDING', (0,0), (-1,-1), 4),
    ('BOTTOMPADDING', (0,0), (-1,-1), 4),
    ('LEFTPADDING', (0,0), (-1,-1), 8),
]))
story.append(t_h4)

sintese_rows = [
    [Paragraph("Setor da Embarcação", style_secao_titulo), Paragraph("Solução de Arranjo Adotada (Baseada nos Similares)", style_secao_titulo)],
    [Paragraph("<b>Cabine de Proa (Cuddy Cabin)</b>", style_corpo), Paragraph("Leito em 'V' com 1,90 m de comprimento útil por 1,60 m de largura nos ombros. Acomoda pernoite de 2 adultos com paióis sob os assentos para bagagem e equipamentos.", style_corpo)],
    [Paragraph("<b>Conveniência & Higiene</b>", style_corpo), Paragraph("Nicho central/bombordo sob o leito de proa para acomodação de sanitário químico portátil (Porta-Potti), garantindo privacidade e uso prático sem comprometer a circulação.", style_corpo)],
    [Paragraph("<b>Posto de Pilotagem (Meia-Nau BE)</b>", style_corpo), Paragraph("Comando ergonômico a boreste protegido por para-brisa envolvente e hardtop/toldo, volante clássico, painel de instrumentos, chave geral e banco do piloto rebatível.", style_corpo)],
    [Paragraph("<b>Cockpit / Praça de Popa</b>", style_corpo), Paragraph("Área aberta de aproximadamente 2,00 m x 1,80 m livre. Bancos laterais e banco de popa transversal para acomodar até 6 pessoas no passeio diurno com mesa de centro desmontável.", style_corpo)],
    [Paragraph("<b>Popa & Plataforma de Embarque</b>", style_corpo), Paragraph("Espelho de popa reforçado para motor de popa de 50-60 HP, duto de água doce para ducha de popa (tanque de 25L), escada de embarque em inox e paióis para bateria e combustível.", style_corpo)],
]

t_sint = Table(sintese_rows, colWidths=[150, 354])
t_sint.setStyle(TableStyle([
    ('BACKGROUND', (0,0), (-1,0), cor_destaque),
    ('GRID', (0,0), (-1,-1), 0.5, cor_borda),
    ('VALIGN', (0,0), (-1,-1), 'TOP'),
    ('TOPPADDING', (0,0), (-1,-1), 6),
    ('BOTTOMPADDING', (0,0), (-1,-1), 6),
    ('ROWBACKGROUNDS', (0,1), (-1,-1), [colors.white, cor_fundo_tabela])
]))
story.append(t_sint)

doc.build(story, canvasmaker=NumberedCanvas)

# Copiar também para o nome alternativo e para a pasta do grupo 6
import shutil
shutil.copy(pdf_path, pdf_path_alt)
shutil.copy(pdf_path, "/home/magdalena/eee/grupos/grupo-6/Arranjos_Gerais_Victor_Lei.pdf")
shutil.copy(pdf_path, "/home/magdalena/eee/grupos/grupo-6/Arranjos_de_Similares_Victor_Lei.pdf")

print("PDF gerado e copiado com sucesso!")
