import os
from reportlab.lib import colors
from reportlab.lib.pagesizes import A4
from reportlab.platypus import SimpleDocTemplate, Paragraph, Spacer, Table, TableStyle, HRFlowable, KeepTogether
from reportlab.lib.styles import getSampleStyleSheet, ParagraphStyle
from reportlab.lib.units import cm

def gerar_estudo_escantilhao_grupo2(pdf_path):
    doc = SimpleDocTemplate(
        pdf_path,
        pagesize=A4,
        leftMargin=1.5*cm,
        rightMargin=1.5*cm,
        topMargin=1.4*cm,
        bottomMargin=1.4*cm
    )
    
    styles = getSampleStyleSheet()
    azul_brana = colors.HexColor('#002B49')
    azul_claro = colors.HexColor('#EBF3F8')
    cinza_fundo = colors.HexColor('#F4F6F8')
    cinza_borda = colors.HexColor('#D1D5DB')
    texto_escuro = colors.HexColor('#1F2937')
    vermelho = colors.HexColor('#9A3231')
    verde = colors.HexColor('#166534')
    
    title_style = ParagraphStyle('DocTitle', parent=styles['Heading1'], fontName='Helvetica-Bold', fontSize=15, leading=19, textColor=azul_brana, spaceAfter=2)
    sub_style = ParagraphStyle('DocSub', parent=styles['Normal'], fontName='Helvetica', fontSize=8.5, leading=11.5, textColor=colors.HexColor('#4B5563'))
    h1_sec = ParagraphStyle('DocH1Sec', parent=styles['Heading1'], fontName='Helvetica-Bold', fontSize=11, leading=14, textColor=azul_brana, spaceBefore=8, spaceAfter=3)
    h2_sec = ParagraphStyle('DocH2Sec', parent=styles['Heading2'], fontName='Helvetica-Bold', fontSize=9.5, leading=12, textColor=vermelho, spaceBefore=5, spaceAfter=2)
    body = ParagraphStyle('DocBody', parent=styles['Normal'], fontName='Helvetica', fontSize=7.6, leading=10.5, textColor=texto_escuro)
    body_bold = ParagraphStyle('DocBodyB', parent=styles['Normal'], fontName='Helvetica-Bold', fontSize=7.6, leading=10.5, textColor=texto_escuro)
    table_hdr = ParagraphStyle('TableHdr', parent=styles['Normal'], fontName='Helvetica-Bold', fontSize=6.8, leading=8.5, textColor=colors.white, alignment=1)
    table_cell = ParagraphStyle('TableCell', parent=styles['Normal'], fontName='Helvetica', fontSize=6.8, leading=8.5, textColor=texto_escuro)
    table_cell_c = ParagraphStyle('TableCellC', parent=styles['Normal'], fontName='Helvetica', fontSize=6.8, leading=8.5, textColor=texto_escuro, alignment=1)
    table_cell_b = ParagraphStyle('TableCellB', parent=styles['Normal'], fontName='Helvetica-Bold', fontSize=6.8, leading=8.5, textColor=azul_brana, alignment=1)

    story = []
    
    # Cabeçalho
    story.append(Paragraph("ESTUDO DE ESCANTILHÃO E DIMENSIONAMENTO ESTRUTURAL", title_style))
    story.append(Paragraph("<b>Projeto:</b> Saveiro Tradicional 'Tesouro da Baía' (12,00 m) · <b>Grupo 2:</b> Carlos Silva, Cauã e Alessandra Feitosa", sub_style))
    story.append(Paragraph("<b>Metodologia:</b> ABS Guide for Building and Classing Offshore Racing Yachts (1994) + Regra Sn de Dave Gerr", sub_style))
    story.append(Paragraph("<b>Instituição:</b> Estaleiro Escola Embrião (EEE) & Brana Projetos Navais · Outubro/2026", sub_style))
    story.append(Spacer(1, 0.15*cm))
    story.append(HRFlowable(width="100%", thickness=1.5, color=azul_brana, spaceBefore=1, spaceAfter=5))
    
    # 1. Metodologia e Critérios de Dimensionamento
    story.append(Paragraph("1. Metodologia de Cálculo e Critérios Normativos", h1_sec))
    met_txt = (
        "O dimensionamento estrutural do <i>Tesouro da Baía</i> foi executado com base nas formulações do <b>ABS Guide for Building and "
        "Classing Offshore Racing Yachts (1994)</b>, complementado pela regra empírica do <i>Scantling Number (Sn)</i> de <b>Dave Gerr</b> "
        "(<i>The Elements of Boat Strength</i>). O método considera as pressões hidrostáticas de fundo e costado, cargas de impacto em mar "
        "abrigado/costeiro na Baía de Todos-os-Santos e as tensões admissíveis para madeiras nativas de lei.<br/>"
        "• <b>Número de Escantilhão de Gerr:</b> $Sn = LOA \\times BOA \\times Pontal = 12,00 \\times 4,358 \\times 1,90 = 99,36\\text{ m³} (3.508\\text{ ft³})$.<br/>"
        "• <b>Tensão Admissível da Chapa (ABS 7.2):</b> $\\sigma_a = 0,40 \\times MOR$ para madeira maciça em tabuado liso (carvel). "
        "Para Cedro/Pau-Roxo ($MOR \\approx 85,0\\text{ N/mm²}$), $\\sigma_a = 34,0\\text{ N/mm²}$ ($3,47\\text{ kgf/mm²}$).<br/>"
        "• <b>Tensão Admissível dos Reforços (ABS 8.2):</b> $\\sigma_a = 0,375 \\times MOR$ para reforços em madeira maciça dura (Massaranduba/Ipê, "
        "$MOR \\approx 110,0\\text{ N/mm²}$), $\\sigma_a = 41,25\\text{ N/mm²}$."
    )
    story.append(Paragraph(met_txt, body))
    story.append(Spacer(1, 0.2*cm))
    
    # 2. Chapeamento e Espessuras de Chapa
    story.append(Paragraph("2. Dimensionamento do Chapeamento (Tabuado do Casco e Convés)", h1_sec))
    story.append(Paragraph(
        "A espessura de chapa requerida ($t$) é governada pela pressão da coluna de água de projeto ($h = 7,11\\text{ m}$ no fundo e $4,62\\text{ m}$ no costado), "
        "pelo menor vão entre reforços ($s$) e pelo coeficiente de aspecto do painel ($c$): "
        "$$t = 1,09 \\cdot |4,2 - 1,13 \\cdot \\sqrt[4]{L}| \\cdot s \\cdot \\sqrt{\\frac{0,001 \\cdot h}{\\sigma_a}} \\quad \\text{[mm]}$$",
        body
    ))
    story.append(Spacer(1, 0.15*cm))
    
    t_chapa_data = [
        [Paragraph("<b>Região do Casco</b>", table_hdr), Paragraph("<b>Painel s × ℓ (mm)</b>", table_hdr), Paragraph("<b>Pressão h (m)</b>", table_hdr), Paragraph("<b>Madeira Adotada</b>", table_hdr), Paragraph("<b>Espessura Exigida (ABS)</b>", table_hdr), Paragraph("<b>Espessura Adotada</b>", table_hdr), Paragraph("<b>Fator Seg. (FS)</b>", table_hdr), Paragraph("<b>Regra Gerr (mm)</b>", table_hdr)],
        [Paragraph("Fundo (Obra Viva)", table_cell), Paragraph("228 × 387 mm", table_cell_c), Paragraph("7,11 m", table_cell_c), Paragraph("Cedro-Rosa", table_cell), Paragraph("23,74 mm", table_cell_c), Paragraph("<b>25,0 mm</b>", table_cell_b), Paragraph("2,77", table_cell_c), Paragraph("34,96 mm", table_cell_c)],
        [Paragraph("Costado (Bordos)", table_cell), Paragraph("387 × 600 mm", table_cell_c), Paragraph("4,62 m", table_cell_c), Paragraph("Pau-Roxo (Roxinho)", table_cell), Paragraph("21,50 mm", table_cell_c), Paragraph("<b>28,0 mm</b>", table_cell_b), Paragraph("2,95", table_cell_c), Paragraph("28,50 mm", table_cell_c)],
        [Paragraph("Espelho de Popa", table_cell), Paragraph("387 × 500 mm", table_cell_c), Paragraph("3,50 m", table_cell_c), Paragraph("Pau-Roxo / Cedro", table_cell), Paragraph("14,20 mm", table_cell_c), Paragraph("<b>16,0 mm</b>", table_cell_b), Paragraph("2,40", table_cell_c), Paragraph("22,00 mm", table_cell_c)],
        [Paragraph("Convés e Trincaniz", table_cell), Paragraph("387 × 500 mm", table_cell_c), Paragraph("2,50 m", table_cell_c), Paragraph("Louro / Teca", table_cell), Paragraph("15,00 mm", table_cell_c), Paragraph("<b>16,0 mm</b>", table_cell_b), Paragraph("2,25", table_cell_c), Paragraph("19,00 mm", table_cell_c)]
    ]
    t1 = Table(t_chapa_data, colWidths=[3.2*cm, 2.3*cm, 1.8*cm, 2.7*cm, 2.4*cm, 2.1*cm, 1.6*cm, 1.9*cm])
    t1.setStyle(TableStyle([
        ('BACKGROUND', (0,0), (-1,0), azul_brana),
        ('GRID', (0,0), (-1,-1), 0.5, cinza_borda),
        ('ROWBACKGROUNDS', (0,1), (-1,-1), [colors.white, cinza_fundo]),
        ('TOPPADDING', (0,0), (-1,-1), 2),
        ('BOTTOMPADDING', (0,0), (-1,-1), 2),
    ]))
    story.append(t1)
    story.append(Spacer(1, 0.2*cm))
    
    # 3. Reforços e Módulos de Seção (SM)
    story.append(Paragraph("3. Reforços Estruturais e Módulos de Seção Requeridos (ABS Eq. 8.1.3 e 8.3.3)", h1_sec))
    story.append(Paragraph(
        "O Módulo de Seção mínimo requerido ($SM$) para vigas e cavernas com largura colaborante de chapeamento é calculado por: "
        "$$SM = \\frac{C \\cdot h \\cdot s \\cdot \\ell^2}{\\sigma_a} \\quad \\text{[cm³]} \\quad (C = 817\\text{ para balizas/vaus; } C = 1800\\text{ para hastilhas de quilha})$$",
        body
    ))
    story.append(Spacer(1, 0.15*cm))
    
    t_ref_data = [
        [Paragraph("<b>Elemento Estrutural</b>", table_hdr), Paragraph("<b>Vão ℓ (m)</b>", table_hdr), Paragraph("<b>Espaç. s (m)</b>", table_hdr), Paragraph("<b>Carga h (m)</b>", table_hdr), Paragraph("<b>SM Exigido (cm³)</b>", table_hdr), Paragraph("<b>Perfil Adotado (Massaranduba)</b>", table_hdr), Paragraph("<b>SM Real (cm³)</b>", table_hdr), Paragraph("<b>Margem Seg.</b>", table_hdr)],
        [Paragraph("Longitudinal de Fundo", table_cell), Paragraph("0,387 m", table_cell_c), Paragraph("0,228 m", table_cell_c), Paragraph("7,11 m", table_cell_c), Paragraph("5,2 cm³", table_cell_c), Paragraph("Peça maciça 19 × 63 mm", table_cell), Paragraph("7,0 cm³", table_cell_b), Paragraph("+34,6%", table_cell_c)],
        [Paragraph("Caverna do Costado", table_cell), Paragraph("1,550 m", table_cell_c), Paragraph("0,387 m", table_cell_c), Paragraph("4,62 m", table_cell_c), Paragraph("133,9 cm³", table_cell_c), Paragraph("Alma 25×175 c/ chapuz 50×25 mm", table_cell), Paragraph("152,1 cm³", table_cell_b), Paragraph("+13,6%", table_cell_c)],
        [Paragraph("Hastilha sobre a Quilha", table_cell), Paragraph("1,200 m", table_cell_c), Paragraph("0,387 m", table_cell_c), Paragraph("7,11 m", table_cell_c), Paragraph("295,1 cm³", table_cell_c), Paragraph("Alma 32×200 c/ chapuz 100×32 mm", table_cell), Paragraph("307,4 cm³", table_cell_b), Paragraph("+4,2%", table_cell_c)],
        [Paragraph("Vau do Convés", table_cell), Paragraph("2,200 m", table_cell_c), Paragraph("0,387 m", table_cell_c), Paragraph("2,50 m", table_cell_c), Paragraph("474,1 cm³", table_cell_c), Paragraph("Alma 32×250 c/ chapuz 100×32 mm", table_cell), Paragraph("482,0 cm³", table_cell_b), Paragraph("+1,7%", table_cell_c)],
        [Paragraph("Prumo de Antepara", table_cell), Paragraph("1,800 m", table_cell_c), Paragraph("0,500 m", table_cell_c), Paragraph("2,80 m", table_cell_c), Paragraph("85,4 cm³", table_cell_c), Paragraph("Alma 25×150 c/ chapuz 50×25 mm", table_cell), Paragraph("96,2 cm³", table_cell_b), Paragraph("+12,6%", table_cell_c)]
    ]
    t2 = Table(t_ref_data, colWidths=[3.2*cm, 1.4*cm, 1.5*cm, 1.5*cm, 2.1*cm, 4.8*cm, 1.9*cm, 1.6*cm])
    t2.setStyle(TableStyle([
        ('BACKGROUND', (0,0), (-1,0), azul_brana),
        ('GRID', (0,0), (-1,-1), 0.5, cinza_borda),
        ('ROWBACKGROUNDS', (0,1), (-1,-1), [colors.white, cinza_fundo]),
        ('TOPPADDING', (0,0), (-1,-1), 2),
        ('BOTTOMPADDING', (0,0), (-1,-1), 2),
    ]))
    story.append(t2)
    story.append(Spacer(1, 0.2*cm))
    
    # 4. Anteparas de Colisão
    story.append(Paragraph("4. Anteparas de Colisão e Estanques (ABS Subseção 7.1 d e 8.2)", h1_sec))
    ant_txt = (
        "• <b>Antepara de Colisão de Vante (Proa):</b> Posicionada na 3ª caverna da proa (Baliza 28 a $X = 10,84\\text{ m}$ do espelho de popa, "
        "correspondendo a <b>9,7% de LOA</b> da roda de proa). Área líquida: $1,49\\text{ m²}$. Espessura mínima exigida pelo ABS: $12,03\\text{ mm}$. "
        "Adotada chapa em madeira maciça estanque de <b>28,0 mm</b> ($FS = 2,32$).<br/>"
        "• <b>Antepara Estanque de Popa (Cadaste/Leme):</b> Posicionada na 3ª caverna da popa (Baliza 3 a $X = 1,16\\text{ m}$ do espelho, "
        "correspondendo a <b>9,7% de LOA</b> da popa). Área líquida: $3,99\\text{ m²}$. Espessura mínima exigida pelo ABS: $11,85\\text{ mm}$. "
        "Adotada chapa estanque de <b>28,0 mm</b> ($FS = 2,36$)."
    )
    story.append(Paragraph(ant_txt, body))
    story.append(Spacer(1, 0.2*cm))
    
    # 5. Quadro Resumo de Pesos do Escantilhão
    story.append(Paragraph("5. Quadro Resumo de Pesos e Balanço Estrutural", h1_sec))
    pes_data = [
        [Paragraph("<b>Grupo Estrutural</b>", table_hdr), Paragraph("<b>Massa Calculada (kg)</b>", table_hdr), Paragraph("<b>% da Estrutura Nua</b>", table_hdr), Paragraph("<b>% do Deslocamento Pleno (14,5 t)</b>", table_hdr), Paragraph("<b>LCG da Popa (m)</b>", table_hdr), Paragraph("<b>VCG da Base (m)</b>", table_hdr)],
        [Paragraph("Chapeamento (Fundo, Costado, Popa, Convés)", table_cell), Paragraph("1.474 kg", table_cell_c), Paragraph("42,5%", table_cell_c), Paragraph("10,2%", table_cell_c), Paragraph("5,32 m", table_cell_c), Paragraph("1,25 m", table_cell_c)],
        [Paragraph("Reforços Longitudinais (Quilha, Sobrequilha, Longit.)", table_cell), Paragraph("610 kg", table_cell_c), Paragraph("17,6%", table_cell_c), Paragraph("4,2%", table_cell_c), Paragraph("5,22 m", table_cell_c), Paragraph("0,40 m", table_cell_c)],
        [Paragraph("Reforços Transversais (30 Cavernas, Hastilhas, Vaus)", table_cell), Paragraph("1.207 kg", table_cell_c), Paragraph("34,8%", table_cell_c), Paragraph("8,3%", table_cell_c), Paragraph("5,50 m", table_cell_c), Paragraph("1,54 m", table_cell_c)],
        [Paragraph("Anteparas Estanques de Colisão (Vante e Ré)", table_cell), Paragraph("174 kg", table_cell_c), Paragraph("5,0%", table_cell_c), Paragraph("1,2%", table_cell_c), Paragraph("3,50 m", table_cell_c), Paragraph("1,52 m", table_cell_c)],
        [Paragraph("<b>ESTRUTURA NUA TEÓRICA</b>", table_cell_b), Paragraph("<b>3.465 kg</b>", table_cell_b), Paragraph("<b>100,0%</b>", table_cell_b), Paragraph("<b>23,9%</b>", table_cell_b), Paragraph("<b>5,40 m</b>", table_cell_b), Paragraph("<b>1,35 m</b>", table_cell_b)],
        [Paragraph("Margem Construtiva, Cravos e Calafeto (+12%)", table_cell), Paragraph("416 kg", table_cell_c), Paragraph("—", table_cell_c), Paragraph("2,9%", table_cell_c), Paragraph("5,40 m", table_cell_c), Paragraph("1,35 m", table_cell_c)],
        [Paragraph("<b>ESTRUTURA NUA CONSTRUÍDA (LIGHTSHIP)</b>", table_cell_b), Paragraph("<b>3.881 kg</b>", table_cell_b), Paragraph("—", table_cell_b), Paragraph("<b>26,8%</b>", table_cell_b), Paragraph("<b>5,40 m</b>", table_cell_b), Paragraph("<b>1,35 m</b>", table_cell_b)]
    ]
    t3 = Table(pes_data, colWidths=[5.4*cm, 2.7*cm, 2.6*cm, 3.2*cm, 2.0*cm, 2.1*cm])
    t3.setStyle(TableStyle([
        ('BACKGROUND', (0,0), (-1,0), azul_brana),
        ('GRID', (0,0), (-1,-1), 0.5, cinza_borda),
        ('ROWBACKGROUNDS', (0,1), (-1,-1), [colors.white, cinza_fundo]),
        ('TOPPADDING', (0,0), (-1,-1), 2),
        ('BOTTOMPADDING', (0,0), (-1,-1), 2),
        ('BACKGROUND', (0,5), (-1,5), azul_claro),
        ('BACKGROUND', (0,7), (-1,7), azul_claro),
    ]))
    story.append(t3)
    story.append(Spacer(1, 0.2*cm))
    
    # Conclusão e Conformidade
    story.append(Paragraph("6. Parecer de Conformidade Estrutural e Segurança", h1_sec))
    par_txt = (
        "O arranjo estrutural do saveiro <i>Tesouro da Baía</i> atende integralmente aos requisitos de escantilhão do Guia ABS (1994) e Dave Gerr. "
        "A adoção de <b>Pau-Roxo (Roxinho) de 28 mm no costado</b> confere fator de segurança de <b>2,95</b>, protegendo a embarcação contra abrasão "
        "e impactos severos de atracação. O fundo em <b>Cedro de 25 mm</b> ($FS = 2,77$) absorve as pressões hidrostáticas sem flexão excessiva. "
        "A estrutura nua construída totaliza <b>3.881 kg</b> (26,8% de $\\Delta$), proporcionando uma viga-navio rígida, longeva e plenamente "
        "capaz de suportar os esforços do mastro de 14,5 m e vela de pena de 95 m²."
    )
    story.append(Paragraph(par_txt, body))
    story.append(Spacer(1, 0.15*cm))
    story.append(HRFlowable(width="100%", thickness=0.8, color=cinza_borda, spaceBefore=2, spaceAfter=4))
    story.append(Paragraph("<i>Relatório Técnico Oficial de Escantilhão — Estaleiro Escola Embrião & Brana Projetos Navais (Outubro/2026).</i>", ParagraphStyle('RodFinal', parent=sub_style, fontSize=7, textColor=colors.HexColor('#6B7280'), alignment=1)))
    
    doc.build(story)

if __name__ == '__main__':
    gerar_estudo_escantilhao_grupo2('/home/magdalena/eee/alunos/carlos-silva/grupo-2-tesouro-da-baia/Estudo_de_Escantilhao_Tesouro_da_Baia.pdf')
