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
)
from reportlab.lib.styles import getSampleStyleSheet, ParagraphStyle
from reportlab.pdfgen import canvas

def build_pdf(filename):
    # Margens estreitas para caber perfeitamente em 1 folha A4 (como na ficha da Brana)
    doc = SimpleDocTemplate(
        filename,
        pagesize=A4,
        leftMargin=30,
        rightMargin=30,
        topMargin=25,
        bottomMargin=20
    )

    styles = getSampleStyleSheet()
    
    # Cores Oficiais Brana
    red_brana = colors.HexColor("#9A3231")
    dark_gray = colors.HexColor("#2B2B2B")
    mid_gray = colors.HexColor("#4A4A4A")
    light_gray = colors.HexColor("#F0F2F5")
    cell_alt = colors.HexColor("#FAFAFA")
    line_gray = colors.HexColor("#B0B5BA")
    section_bg = colors.HexColor("#333333")

    # Estilos de Texto
    logo_style = ParagraphStyle(
        'LogoStyle',
        fontName='Helvetica-Bold',
        fontSize=18,
        leading=20,
        textColor=red_brana
    )
    
    logo_sub = ParagraphStyle(
        'LogoSub',
        fontName='Helvetica-Bold',
        fontSize=9,
        leading=11,
        textColor=dark_gray,
        letterSpacing=1
    )

    title_main = ParagraphStyle(
        'TitleMain',
        fontName='Helvetica-Bold',
        fontSize=13,
        leading=15,
        textColor=dark_gray,
        alignment=2 # Direita
    )
    
    title_sub = ParagraphStyle(
        'TitleSub',
        fontName='Helvetica-Oblique',
        fontSize=7.5,
        leading=9.5,
        textColor=mid_gray,
        alignment=2
    )

    th_style = ParagraphStyle(
        'TableHeader',
        fontName='Helvetica-Bold',
        fontSize=7.5,
        leading=9.5,
        textColor=colors.white,
        alignment=1 # Centro
    )

    sec_hdr_style = ParagraphStyle(
        'SectionHeader',
        fontName='Helvetica-Bold',
        fontSize=8,
        leading=10,
        textColor=colors.white
    )

    td_param = ParagraphStyle(
        'TdParam',
        fontName='Helvetica',
        fontSize=7.5,
        leading=9.5,
        textColor=dark_gray
    )

    td_formula = ParagraphStyle(
        'TdFormula',
        fontName='Helvetica-Bold',
        fontSize=7.5,
        leading=9.5,
        textColor=dark_gray
    )

    td_subst = ParagraphStyle(
        'TdSubst',
        fontName='Courier',
        fontSize=7.5,
        leading=9.5,
        textColor=dark_gray,
        alignment=0
    )

    td_res = ParagraphStyle(
        'TdRes',
        fontName='Helvetica-Bold',
        fontSize=8,
        leading=10,
        textColor=red_brana,
        alignment=1
    )

    td_obs = ParagraphStyle(
        'TdObs',
        fontName='Helvetica-Oblique',
        fontSize=7,
        leading=8.5,
        textColor=mid_gray
    )

    story = []

    # 1. CABEÇALHO DO DOCUMENTO
    hdr_table_data = [
        [
            Paragraph("<b>brana</b><br/><font size=7 color='#404040'><b>PROJETOS NAVAIS</b></font>", logo_style),
            Paragraph("<b>COEFICIENTES DE FORMA — SEU PROJETO</b><br/><font size=7.5 color='#555555'><i>Preencha os dados de entrada e calcule cada coeficiente | unidades no sistema métrico (SI)</i></font>", title_main)
        ]
    ]
    t_hdr = Table(hdr_table_data, colWidths=[160, 375])
    t_hdr.setStyle(TableStyle([
        ('VALIGN', (0,0), (-1,-1), 'MIDDLE'),
        ('BOTTOMPADDING', (0,0), (-1,-1), 2),
        ('TOPPADDING', (0,0), (-1,-1), 0),
        ('LEFTPADDING', (0,0), (-1,-1), 0),
        ('RIGHTPADDING', (0,0), (-1,-1), 0),
    ]))
    story.append(t_hdr)
    story.append(Spacer(1, 4))
    story.append(HRFlowable(width="100%", thickness=1.5, color=red_brana, spaceAfter=4))

    # 2. TABELA PRINCIPAL
    # Dimensões da tabela: 535 pt total -> colWidths: [135, 120, 115, 55, 110]
    
    # Dados calculados do projeto:
    # LOA = 4.00 m | LWL = 3.626 m | BOA = 1.546 m | BWL = 1.281 m | Tc = 0.291 m
    # Nabla = 0.6472 m³ | Delta = 663.4 kg
    # Am = 0.224 m² | WPA = 3.308 m² (CWPA = 3.308 / (3.626*1.281) = 0.712)
    # CP = 0.6472 / (0.224 * 3.626) = 0.7968 -> 0.797
    # CB = 0.6472 / (3.626 * 1.281 * 0.291) = 0.4795 -> 0.480
    # CAM = 0.224 / (1.281 * 0.291) = 0.6009 -> 0.601
    # CWPA = 0.712
    # CB_check = 0.797 * 0.601 = 0.479
    # LOA/BOA = 4.00 / 1.546 = 2.59
    # LWL/LOA = 3.626 / 4.00 = 0.91
    # BWL/BOA = 1.281 / 1.546 = 0.83
    # Delta_lb = 663.4 * 2.205 = 1462.8 lb
    # Delta_lt = 1462.8 / 2240 = 0.653 t.long.
    # LWL_ft = 3.626 * 3.281 = 11.90 ft
    # DLR = 0.653 / (0.01 * 11.90)^3 = 0.653 / (0.1190)^3 = 0.653 / 0.001685 = 387.5
    # SDR = N/A (casco a motor)

    table_data = [
        # Cabeçalho da Tabela
        [
            Paragraph("PARÂMETRO / COEFICIENTE", th_style),
            Paragraph("SÍMBOLO E FÓRMULA", th_style),
            Paragraph("SUBSTITUIÇÃO NUMÉRICA", th_style),
            Paragraph("RESULT.", th_style),
            Paragraph("FAIXA TÍPICA / OBSERVAÇÃO", th_style)
        ],
        
        # SEÇÃO 1: DADOS DE ENTRADA
        [
            Paragraph("<b>DADOS DE ENTRADA — medir no plano de linhas</b>", sec_hdr_style),
            "", "", "", ""
        ],
        [
            Paragraph("<b>Embarcação (estaleiro / modelo)</b>", td_param),
            Paragraph("—", td_formula),
            Paragraph("Saveiro Quinado 4,0m - Matheus Silva", td_subst),
            Paragraph("—", td_res),
            Paragraph("identifique o seu projeto", td_obs)
        ],
        [
            Paragraph("Comprimento total", td_param),
            Paragraph("LOA [m]", td_formula),
            Paragraph("4,000", td_subst),
            Paragraph("<b>4,00 m</b>", td_res),
            Paragraph("", td_obs)
        ],
        [
            Paragraph("Comprimento na linha d'água", td_param),
            Paragraph("LWL [m]", td_formula),
            Paragraph("3,626", td_subst),
            Paragraph("<b>3,63 m</b>", td_res),
            Paragraph("≈ 0,90 × LOA (deu 0,91)", td_obs)
        ],
        [
            Paragraph("Boca máxima", td_param),
            Paragraph("BOA [m]", td_formula),
            Paragraph("1,546", td_subst),
            Paragraph("<b>1,55 m</b>", td_res),
            Paragraph("", td_obs)
        ],
        [
            Paragraph("Boca na linha d'água", td_param),
            Paragraph("BWL [m]", td_formula),
            Paragraph("1,281", td_subst),
            Paragraph("<b>1,28 m</b>", td_res),
            Paragraph("≈ 0,90 × BOA (deu 0,83)", td_obs)
        ],
        [
            Paragraph("Calado da canoa (d)", td_param),
            Paragraph("Tc [m]", td_formula),
            Paragraph("0,291", td_subst),
            Paragraph("<b>0,291 m</b>", td_res),
            Paragraph("sem apêndices (DWL)", td_obs)
        ],
        [
            Paragraph("Volume de deslocamento", td_param),
            Paragraph("∇ [m³]", td_formula),
            Paragraph("0,6472", td_subst),
            Paragraph("<b>0,647 m³</b>", td_res),
            Paragraph("volume submerso", td_obs)
        ],
        [
            Paragraph("Deslocamento (massa)", td_param),
            Paragraph("Δ = ∇ × 1025", td_formula),
            Paragraph("0,6472 × 1025", td_subst),
            Paragraph("<b>663 kg</b>", td_res),
            Paragraph("kg — água salgada", td_obs)
        ],
        [
            Paragraph("Área da seção máxima", td_param),
            Paragraph("Am (Ax) [m²]", td_formula),
            Paragraph("0,224", td_subst),
            Paragraph("<b>0,224 m²</b>", td_res),
            Paragraph("a ≈ 55% da LWL, a ré da meia-nau", td_obs)
        ],
        [
            Paragraph("Área do plano de linha d'água", td_param),
            Paragraph("WPA [m²]", td_formula),
            Paragraph("3,308", td_subst),
            Paragraph("<b>3,31 m²</b>", td_res),
            Paragraph("", td_obs)
        ],
        [
            Paragraph("Área vélica (só veleiro)", td_param),
            Paragraph("SA [m²]", td_formula),
            Paragraph("—", td_subst),
            Paragraph("—", td_res),
            Paragraph("preencher somente se veleiro", td_obs)
        ],

        # SEÇÃO 2: COEFICIENTES DE FORMA
        [
            Paragraph("<b>COEFICIENTES DE FORMA</b>", sec_hdr_style),
            "", "", "", ""
        ],
        [
            Paragraph("Coeficiente prismático", td_param),
            Paragraph("CP = ∇ / (Am × LWL)", td_formula),
            Paragraph("0,6472 / (0,224 × 3,626)", td_subst),
            Paragraph("<b>0,797</b>", td_res),
            Paragraph("0,52–0,58 desloc. · 0,68–0,78 planeio", td_obs)
        ],
        [
            Paragraph("Coeficiente de bloco", td_param),
            Paragraph("CB = ∇ / (LWL × BWL × Tc)", td_formula),
            Paragraph("0,6472 / (3,626 × 1,281 × 0,291)", td_subst),
            Paragraph("<b>0,480</b>", td_res),
            Paragraph("pouco usado em esporte e recreio", td_obs)
        ],
        [
            Paragraph("Coeficiente de área máxima", td_param),
            Paragraph("CAM = Am / (BWL × Tc)", td_formula),
            Paragraph("0,224 / (1,281 × 0,291)", td_subst),
            Paragraph("<b>0,601</b>", td_res),
            Paragraph("≈ 0,60 em lanchas planadoras", td_obs)
        ],
        [
            Paragraph("Coef. do plano de linha d'água", td_param),
            Paragraph("CWPA = WPA / (LWL × BWL)", td_formula),
            Paragraph("3,308 / (3,626 × 1,281)", td_subst),
            Paragraph("<b>0,712</b>", td_res),
            Paragraph("≈ 0,80 em planadoras · carga e estab.", td_obs)
        ],
        [
            Paragraph("<b>Verificação (consistência)</b>", td_param),
            Paragraph("<b>CB = CP × CAM</b>", td_formula),
            Paragraph("0,797 × 0,601", td_subst),
            Paragraph("<b>0,479</b>", td_res),
            Paragraph("<b>confira: deve dar o mesmo CB (≈0,480)</b>", td_obs)
        ],

        # SEÇÃO 3: RAZÕES ADIMENSIONAIS
        [
            Paragraph("<b>RAZÕES ADIMENSIONAIS</b>", sec_hdr_style),
            "", "", "", ""
        ],
        [
            Paragraph("Razão comprimento / boca", td_param),
            Paragraph("LOA / BOA", td_formula),
            Paragraph("4,000 / 1,546", td_subst),
            Paragraph("<b>2,59</b>", td_res),
            Paragraph("≈ 3,0–3,8", td_obs)
        ],
        [
            Paragraph("Razão de comprimentos", td_param),
            Paragraph("LWL / LOA", td_formula),
            Paragraph("3,626 / 4,000", td_subst),
            Paragraph("<b>0,91</b>", td_res),
            Paragraph("≈ 0,88–0,95", td_obs)
        ],
        [
            Paragraph("Razão de bocas", td_param),
            Paragraph("BWL / BOA", td_formula),
            Paragraph("1,281 / 1,546", td_subst),
            Paragraph("<b>0,83</b>", td_res),
            Paragraph("≈ 0,85–0,92", td_obs)
        ],
        [
            Paragraph("Conversão: Δ para libras", td_param),
            Paragraph("Δ[lb] = Δ[kg] × 2,205", td_formula),
            Paragraph("663,4 × 2,205", td_subst),
            Paragraph("<b>1463 lb</b>", td_res),
            Paragraph("etapa intermediária do DLR", td_obs)
        ],
        [
            Paragraph("Conversão: libras p/ ton. longas", td_param),
            Paragraph("Δ[t.long.] = Δ[lb] / 2240", td_formula),
            Paragraph("1462,8 / 2240", td_subst),
            Paragraph("<b>0,653 t.l.</b>", td_res),
            Paragraph("etapa intermediária do DLR", td_obs)
        ],
        [
            Paragraph("Conversão: LWL para pés", td_param),
            Paragraph("LWL[pés] = LWL[m] × 3,281", td_formula),
            Paragraph("3,626 × 3,281", td_subst),
            Paragraph("<b>11,90 ft</b>", td_res),
            Paragraph("etapa intermediária do DLR", td_obs)
        ],
        [
            Paragraph("Razão desloc.–comprimento", td_param),
            Paragraph("DLR = Δ[t.long.] / (0,01 × LWL[pés])³", td_formula),
            Paragraph("0,653 / (0,1190)³", td_subst),
            Paragraph("<b>387,5</b>", td_res),
            Paragraph("<100 ultraleve · 100–200 leve · 200–300 médio · >300 pesado", td_obs)
        ],
        [
            Paragraph("Razão área vélica–deslocamento", td_param),
            Paragraph("SDR = SA / ∇^(2/3)", td_formula),
            Paragraph("—", td_subst),
            Paragraph("—", td_res),
            Paragraph("só veleiros · 14 (pouco pano) a 22+ (muito pano)", td_obs)
        ]
    ]

    t_main = Table(table_data, colWidths=[130, 125, 115, 55, 110])
    
    t_style = [
        # Cabeçalho da tabela
        ('BACKGROUND', (0,0), (-1,0), red_brana),
        ('GRID', (0,0), (-1,-1), 0.5, line_gray),
        ('VALIGN', (0,0), (-1,-1), 'MIDDLE'),
        ('TOPPADDING', (0,0), (-1,-1), 1.8),
        ('BOTTOMPADDING', (0,0), (-1,-1), 1.8),
        ('LEFTPADDING', (0,0), (-1,-1), 4),
        ('RIGHTPADDING', (0,0), (-1,-1), 4),
        
        # Seção 1 Header (Linha 1)
        ('SPAN', (0,1), (-1,1)),
        ('BACKGROUND', (0,1), (-1,1), section_bg),
        
        # Seção 2 Header (Linha 13)
        ('SPAN', (0,13), (-1,13)),
        ('BACKGROUND', (0,13), (-1,13), section_bg),
        
        # Seção 3 Header (Linha 19)
        ('SPAN', (0,19), (-1,19)),
        ('BACKGROUND', (0,19), (-1,19), section_bg),
        
        # Destaque Linha Verificação (Linha 18)
        ('BACKGROUND', (0,18), (-1,18), colors.HexColor("#FFF2F2")),
    ]

    # Cores alternadas para as linhas normais
    row_count = len(table_data)
    for r in range(row_count):
        if r not in [0, 1, 13, 18, 19]:
            bg = light_gray if (r % 2 == 1) else cell_alt
            t_style.append(('BACKGROUND', (0,r), (-1,r), bg))

    t_main.setStyle(TableStyle(t_style))
    story.append(t_main)
    story.append(Spacer(1, 4))

    # 3. NOTAS DE RODAPÉ E DIREITOS AUTORAIS BRANA
    footer_text1 = Paragraph(
        "<b>∇ = volume de deslocamento; Δ = deslocamento em massa. • Preencha primeiro os dados de entrada, depois calcule na ordem das linhas.</b>",
        ParagraphStyle('FootNote1', fontName='Helvetica-Bold', fontSize=6.5, leading=8, textColor=dark_gray)
    )
    story.append(footer_text1)
    story.append(Spacer(1, 2))

    footer_legal = Paragraph(
        "<i>O conteúdo deste material é de uso exclusivo dos alunos matriculados nos cursos do Brana. Este não pode ser reproduzido, copiado, vendido ou transferido. A reprodução total ou parcial de qualquer conteúdo é expressamente proibida e constitui crime de violação de Direito Autoral.</i>",
        ParagraphStyle('FootLegal', fontName='Helvetica-Oblique', fontSize=5.8, leading=7.2, textColor=mid_gray)
    )
    story.append(footer_legal)
    story.append(Spacer(1, 2))

    # Contatos do Rodapé
    footer_contacts = Paragraph(
        "<b>Avenida Rio Branco, 18 – 15º andar | Centro, Rio de Janeiro – RJ • Tel: (21) 3511-6551 | (21) 99618-2657 • www.brana.com.br • facebook.com/branaval</b>",
        ParagraphStyle('FootContacts', fontName='Helvetica', fontSize=5.8, leading=7.2, textColor=dark_gray, alignment=1)
    )
    story.append(footer_contacts)

    doc.build(story)
    print("Ficha Oficial de Coeficientes de Forma gerada com sucesso!")

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