import json
import os
from reportlab.lib.pagesizes import A4, landscape
from reportlab.platypus import (
    SimpleDocTemplate, Paragraph, Spacer, Table, TableStyle, Image as RLImage, PageBreak, KeepTogether, HRFlowable
)
from reportlab.lib.styles import getSampleStyleSheet, ParagraphStyle
from reportlab.lib import colors
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(40, 560, "BRANA | ESCOLA DE ENGENHARIA NAVAL & ESTALEIRO ESCOLA EMBRIÃO")
            self.setFont("Helvetica", 8)
            self.setFillColor(colors.HexColor("#64748B"))
            self.drawRightString(800, 560, "Saveiro Costeiro Tradicional 7,00m • Plano de Linhas 2D & Tabela de Cotas")
            self.setStrokeColor(colors.HexColor("#CBD5E1"))
            self.setLineWidth(0.5)
            self.line(40, 552, 800, 552)

        # Footer (todas as páginas)
        self.setFont("Helvetica", 8)
        self.setFillColor(colors.HexColor("#64748B"))
        self.drawString(40, 24, "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(800, 24, page_text)
        self.setStrokeColor(colors.HexColor("#CBD5E1"))
        self.setLineWidth(0.5)
        self.line(40, 34, 800, 34)
        
        self.restoreState()

def gerar_pdf_plano_linhas():
    pdf_path = "/home/magdalena/eee/alunos/antonio-manoel-costa/Plano_de_Linhas_Antonio_Manoel_Costa.pdf"
    img_lines = "/home/magdalena/eee/alunos/antonio-manoel-costa/plano_linhas_2d_7m.png"
    img_croqui = "/home/magdalena/eee/alunos/antonio-manoel-costa/croqui_papel_milimetrado_antonio_costa.jpg"

    doc = SimpleDocTemplate(
        pdf_path,
        pagesize=landscape(A4),
        leftMargin=40,
        rightMargin=40,
        topMargin=36,
        bottomMargin=36
    )

    styles = getSampleStyleSheet()

    c_primary = colors.HexColor("#0B2545")
    c_secondary = colors.HexColor("#134074")
    c_accent = colors.HexColor("#C59B27")
    c_dark = colors.HexColor("#1E293B")
    c_light_bg = colors.HexColor("#F8FAFC")

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

    subtitle_style = ParagraphStyle(
        'DocSubtitle',
        parent=styles['Normal'],
        fontName='Helvetica-Bold',
        fontSize=9,
        leading=12,
        textColor=c_accent,
        alignment=1,
        spaceAfter=6
    )

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

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

    cell_bold = ParagraphStyle(
        'CellBold',
        parent=styles['Normal'],
        fontName='Helvetica-Bold',
        fontSize=7,
        leading=9,
        textColor=c_primary,
        alignment=1
    )

    cell_norm = ParagraphStyle(
        'CellNorm',
        parent=styles['Normal'],
        fontName='Helvetica',
        fontSize=7,
        leading=9,
        textColor=c_dark,
        alignment=1
    )

    elements = []

    # ==================== FOLHA 1: PLANO DE LINHAS 2D ====================
    elements.append(Paragraph("PLANO DE LINHAS & GEOMETRIA DO CASCO 2D", title_style))
    elements.append(Paragraph("Saveiro Costeiro Tradicional 7,00 m • Metodologia BRANA / Estaleiro Escola Embrião", subtitle_style))
    elements.append(HRFlowable(width="100%", thickness=1.2, color=c_accent, spaceBefore=0, spaceAfter=4))

    # Inserção do Desenho Técnico em Alta Resolução
    if os.path.exists(img_lines):
        elements.append(RLImage(img_lines, width=760, height=440))

    elements.append(PageBreak())

    # ==================== FOLHA 2: TABELA DE COTAS & REGISTRO ====================
    elements.append(Paragraph("TABELA DE COTAS (OFFSETS) & MEMORIAL DE FORMA", title_style))
    elements.append(Paragraph("Calibração Geométrica a partir do Croqui em Papel Milimetrado (Cm = 0,90)", subtitle_style))
    elements.append(HRFlowable(width="100%", thickness=1.2, color=c_accent, spaceBefore=0, spaceAfter=6))

    # Tabela de Cotas
    cotas_headers = [
        Paragraph("<b>Grandeza / Cota (m)</b>", cell_bold),
        Paragraph("<b>B1 (Popa)<br/>x = 0,00 m</b>", cell_bold),
        Paragraph("<b>B2<br/>x = 1,17 m</b>", cell_bold),
        Paragraph("<b>B3<br/>x = 2,33 m</b>", cell_bold),
        Paragraph("<b>B4 (Mestra)<br/>x = 3,50 m</b>", cell_bold),
        Paragraph("<b>B5<br/>x = 4,67 m</b>", cell_bold),
        Paragraph("<b>B6<br/>x = 5,83 m</b>", cell_bold),
        Paragraph("<b>B7 (Proa)<br/>x = 7,00 m</b>", cell_bold),
    ]

    cotas_data = [
        cotas_headers,
        [Paragraph("<b>Meia-Boca no Convés (Y)</b>", cell_bold), Paragraph("0,825 m", cell_norm), Paragraph("1,150 m", cell_norm), Paragraph("1,340 m", cell_norm), Paragraph("1,360 m", cell_norm), Paragraph("1,180 m", cell_norm), Paragraph("0,750 m", cell_norm), Paragraph("0,000 m", cell_norm)],
        [Paragraph("<b>Meia-Boca na WL 0,35m (Y)</b>", cell_bold), Paragraph("0,650 m", cell_norm), Paragraph("0,920 m", cell_norm), Paragraph("1,120 m", cell_norm), Paragraph("1,150 m", cell_norm), Paragraph("0,980 m", cell_norm), Paragraph("0,550 m", cell_norm), Paragraph("0,000 m", cell_norm)],
        [Paragraph("<b>Meia-Boca no Fundo (Y)</b>", cell_bold), Paragraph("0,550 m", cell_norm), Paragraph("0,800 m", cell_norm), Paragraph("0,980 m", cell_norm), Paragraph("1,000 m", cell_norm), Paragraph("0,850 m", cell_norm), Paragraph("0,400 m", cell_norm), Paragraph("0,000 m", cell_norm)],
        [Paragraph("<b>Altura da Borda / Convés (Z)</b>", cell_bold), Paragraph("1,050 m", cell_norm), Paragraph("0,980 m", cell_norm), Paragraph("0,950 m", cell_norm), Paragraph("0,960 m", cell_norm), Paragraph("1,020 m", cell_norm), Paragraph("1,120 m", cell_norm), Paragraph("1,250 m", cell_norm)],
        [Paragraph("<b>Altura da Quilha / Fundo (Z)</b>", cell_bold), Paragraph("0,120 m", cell_norm), Paragraph("0,040 m", cell_norm), Paragraph("0,000 m", cell_norm), Paragraph("0,000 m", cell_norm), Paragraph("0,050 m", cell_norm), Paragraph("0,250 m", cell_norm), Paragraph("1,250 m", cell_norm)],
        [Paragraph("<b>Pontal Local (Z_borda - Z_quilha)</b>", cell_bold), Paragraph("0,930 m", cell_norm), Paragraph("0,940 m", cell_norm), Paragraph("0,950 m", cell_norm), Paragraph("0,960 m", cell_norm), Paragraph("0,970 m", cell_norm), Paragraph("0,870 m", cell_norm), Paragraph("0,000 m", cell_norm)],
    ]

    t_cotas = Table(cotas_data, colWidths=[160, 85, 85, 85, 85, 85, 85, 85])
    t_cotas.setStyle(TableStyle([
        ('BACKGROUND', (0,0), (-1,0), c_primary),
        ('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),
        ('BOTTOMPADDING', (0,0), (-1,-1), 3),
        ('VALIGN', (0,0), (-1,-1), 'MIDDLE'),
    ]))
    elements.append(t_cotas)
    elements.append(Spacer(1, 8))

    # Tabela com o Croqui original e Notas Técnicas
    if os.path.exists(img_croqui):
        croqui_box = [
            [
                RLImage(img_croqui, width=320, height=190),
                Paragraph(
                    "<b>MEMORIAL DESCRITIVO DO TRAÇADO DE LINHAS:</b><br/><br/>"
                    "<b>1. Origem e Calibração:</b> O traçado foi integralmente derivado do croqui em papel milimetrado do projetista Antônio Manoel Costa, escalado proporcionalmente para $LOA = 7,00$ m e $BOA = 2,72$ m.<br/><br/>"
                    "<b>2. Coeficiente de Seção Mestra ($C_M = 0,90$):</b> O cálculo manuscrito de $C_M = 0,90$ foi preservado na íntegra. A geometria de fundo firme com bojo suave proporciona alta estabilidade inicial e segurança no embarque de passageiros de todas as faixas etárias.<br/><br/>"
                    "<b>3. Tosamento e Comportamento Náutico:</b> O tosamento com elevação de 0,95 m na proa (FF) assegura excelente reserva de flutuabilidade contra ondas no contorno do Farol da Barra.<br/><br/>"
                    "<b>4. Espelho de Popa:</b> Largura de 1,65 m no convés garantindo sustentação da esteira, travamento do suporte de motor até 15 HP e apoio para o toldo amplo.",
                    body_style
                )
            ]
        ]
        t_croqui = Table(croqui_box, colWidths=[330, 430])
        t_croqui.setStyle(TableStyle([
            ('VALIGN', (0,0), (-1,-1), 'TOP'),
            ('BOX', (0,0), (-1,-1), 0.5, colors.HexColor("#CBD5E1")),
            ('BACKGROUND', (0,0), (-1,-1), c_light_bg),
            ('PADDING', (0,0), (-1,-1), 6),
        ]))
        elements.append(t_croqui)

    doc.build(elements, canvasmaker=NumberedCanvas)
    print("PDF de Plano de Linhas 2D gerado com sucesso em:", pdf_path)

if __name__ == "__main__":
    gerar_pdf_plano_linhas()
