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

def gerar_pdf_memoria_arranjo_estrutural_grupo2(pdf_path):
    doc = SimpleDocTemplate(
        pdf_path,
        pagesize=landscape(A4),
        leftMargin=1.2*cm,
        rightMargin=1.2*cm,
        topMargin=1.2*cm,
        bottomMargin=1.2*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')
    
    title_style = ParagraphStyle('DocTitle', parent=styles['Heading1'], fontName='Helvetica-Bold', fontSize=13.5, leading=16.5, textColor=azul_brana, spaceAfter=2)
    sub_style = ParagraphStyle('DocSub', parent=styles['Normal'], fontName='Helvetica', fontSize=8, leading=10.5, textColor=colors.HexColor('#4B5563'))
    h2_style = ParagraphStyle('DocH2', parent=styles['Heading2'], fontName='Helvetica-Bold', fontSize=9, leading=11.5, textColor=vermelho, spaceBefore=4, spaceAfter=2)
    body_style = ParagraphStyle('DocBody', parent=styles['Normal'], fontName='Helvetica', fontSize=7.2, leading=9.5, textColor=texto_escuro)
    table_hdr = ParagraphStyle('TableHdr', parent=styles['Normal'], fontName='Helvetica-Bold', fontSize=6.5, leading=8, textColor=colors.white, alignment=1)
    table_cell = ParagraphStyle('TableCell', parent=styles['Normal'], fontName='Helvetica', fontSize=6.5, leading=8, textColor=texto_escuro)
    table_cell_c = ParagraphStyle('TableCellC', parent=styles['Normal'], fontName='Helvetica', fontSize=6.5, leading=8, textColor=texto_escuro, alignment=1)
    table_cell_b = ParagraphStyle('TableCellB', parent=styles['Normal'], fontName='Helvetica-Bold', fontSize=6.5, leading=8, textColor=azul_brana, alignment=1)
    table_cell_grp = ParagraphStyle('TableCellG', parent=styles['Normal'], fontName='Helvetica-Bold', fontSize=6.5, leading=8, textColor=vermelho)

    story = []
    
    # Cabeçalho
    story.append(Paragraph("MEMÓRIA DE CÁLCULO DE PESOS DO ARRANJO ESTRUTURAL E ESCANTILHÃO (ABS / DAVE GERR)", title_style))
    story.append(Paragraph("<b>Embarcação:</b> Saveiro Tradicional 'Tesouro da Baía' (12,00 m × 4,36 m × 2,79 m) | <b>Grupo 2:</b> Carlos Silva, Cauã e Alessandra Feitosa | <b>Estaleiro Escola Embrião / Brana</b>", sub_style))
    story.append(Paragraph("<b>Metodologia:</b> ABS Guide for Building and Classing Offshore Racing Yachts (1994) · Regra Sn de Dave Gerr · Tabela de Cotas V4 (11 Balizas / 30 Cavernas)", sub_style))
    story.append(Spacer(1, 0.15*cm))
    story.append(HRFlowable(width="100%", thickness=1.2, color=azul_brana, spaceBefore=1, spaceAfter=3))
    
    headers = [
        Paragraph("<b>Elemento Estrutural do Arranjo</b>", table_hdr),
        Paragraph("<b>Qtd / Área / Comp.</b>", table_hdr),
        Paragraph("<b>Espessura / Bitola</b>", table_hdr),
        Paragraph("<b>Dens. (kg/m³)</b>", table_hdr),
        Paragraph("<b>Massa (kg)</b>", table_hdr),
        Paragraph("<b>% Est.</b>", table_hdr),
        Paragraph("<b>LCG (m)</b>", table_hdr),
        Paragraph("<b>TCG (m)</b>", table_hdr),
        Paragraph("<b>VCG (m)</b>", table_hdr),
        Paragraph("<b>Módulo SM (cm³) / Critério de Dimensionamento</b>", table_hdr)
    ]
    
    t_data = [headers]
    
    itens = [
        # GRUPO 1: CHAPEAMENTO
        ("1. CHAPEAMENTO (TABUADO EXTERNO)", "", "", "", "", "", "", "", "", "Área Total: 95,97 m² (Madeira nobre 650 kg/m³)"),
        ("1.1 Chapa do Fundo (Obra Viva)", "36,00 m²", "25,0 mm", "650", 585.0, 5.10, 0.00, 0.42, "Carga 7,11 m de água | ABS exige 23,74 mm | FS = 2,77"),
        ("1.2 Chapa do Costado - Bombordo (BB)", "17,05 m²", "28,0 mm", "650", 310.0, 5.55, -1.85, 1.65, "Tensão de flexão transversal e torção | FS = 2,95"),
        ("1.3 Chapa do Costado - Boreste (BE)", "17,05 m²", "28,0 mm", "650", 310.0, 5.55, 1.85, 1.65, "Tensão de flexão transversal e torção | FS = 2,95"),
        ("1.4 Espelho de Popa", "7,12 m²", "16,0 mm", "650", 74.0, 0.08, 0.00, 1.80, "Apoio do leme e sobrequilha de popa | ABS exige 14,2 mm"),
        ("1.5 Convés e Trincaniz", "18,75 m²", "16,0 mm", "650", 195.0, 5.80, 0.00, 2.15, "Carga de trabalho de marinharia e tráfego | ABS exige 15,0 mm"),
        ("SUBTOTAL 1: CHAPEAMENTO", "95,97 m²", "16 a 28 mm", "650", 1474.0, 5.32, 0.00, 1.25, "42,5% da Estrutura Nua (38,0% c/ margem)"),
        
        # GRUPO 2: REFORÇOS LONGITUDINAIS
        ("2. REFORÇOS LONGITUDINAIS", "", "", "", "", "", "", "", "", "Madeira de Lei dura (Massaranduba/Ipê 980 kg/m³)"),
        ("2.1 Quilha Corrida Central", "12,00 m", "150 × 150 mm", "980", 264.6, 5.10, 0.00, 0.08, "Espinha dorsal do casco | Resistência ao abalroamento"),
        ("2.2 Sobrequilha Maciça", "11,50 m", "100 × 120 mm", "980", 135.2, 5.20, 0.00, 0.22, "Travamento do pé das cavernas e berço da carlinga"),
        ("2.3 Longitudinais de Fundo (6 por bordo)", "120,0 m total", "19 × 63 mm", "980", 140.8, 5.20, 0.00, 0.35, "Painéis 228 × 387 mm | SM = 7,0 cm³ (exigido 5,2 cm³)"),
        ("2.4 Sicordas de Apoio do Convés (2x)", "22,0 m total", "40 × 80 mm", "980", 69.0, 5.80, 0.00, 2.10, "Apoio longitudinal dos vaus e borda falsa"),
        ("SUBTOTAL 2: REFORÇOS LONGITUDINAIS", "165,5 m", "Diversas", "980", 609.6, 5.22, 0.00, 0.40, "17,6% da Estrutura Nua"),
        
        # GRUPO 3: REFORÇOS TRANSVERSAIS
        ("3. REFORÇOS TRANSVERSAIS (CAVERNAMENTO)", "", "", "", "", "", "", "", "", "30 Balizas/Cavernas a cada 387 mm ao longo de 12 m"),
        ("3.1 Cavernas do Costado (30 pares BB/BE)", "60 braços", "25×175 c/ 50×25", "980", 542.0, 5.45, 0.00, 1.55, "SM = 152,1 cm³ (exigido 133,9 cm³ pelo ABS Eq. 8.1.3)"),
        ("3.2 Hastilhas sobre a Quilha (30 un)", "30 un", "32×200 c/ 100×32", "980", 280.0, 5.15, 0.00, 0.30, "SM = 307,4 cm³ (exigido 295,1 cm³ pelo ABS Eq. 8.3.3)"),
        ("3.3 Vaus do Convés (30 un)", "30 un", "32×250 c/ 100×32", "980", 522.0, 5.75, 0.00, 2.20, "SM = 482,0 cm³ (exigido 474,1 cm³ pelo ABS Eq. 8.1.3)"),
        ("SUBTOTAL 3: REFORÇOS TRANSVERSAIS", "90 peças", "Compostas", "980", 1344.0, 5.50, 0.00, 1.54, "38,8% da Estrutura Nua"),
        
        # GRUPO 4: ANTEPARAS E COMPARTIMENTAÇÃO
        ("4. ANTEPARAS DE COLISÃO E COMPARTIMENTAÇÃO", "", "", "", "", "", "", "", "", "Madeira maciça estanque / Cavernas reforçadas"),
        ("4.1 Antepara de Colisão Vante (Bal. 28)", "1,49 m²", "28,0 mm", "650", 42.0, 10.84, 0.00, 1.75, "A 10,84 m do espelho (9,7% LOA) | Exigido 12,0 mm"),
        ("4.2 Antepara Estanque Popa (Bal. 3)", "3,99 m²", "28,0 mm", "650", 132.0, 1.16, 0.00, 1.45, "A 1,16 m do espelho (9,7% LOA) | Exigido 11,85 mm"),
        ("SUBTOTAL 4: ANTEPARAS DE COLISÃO", "5,48 m²", "28,0 mm", "650", 174.0, 3.50, 0.00, 1.52, "5,0% da Estrutura Nua"),
        
        # RESUMO ESTRUTURAL
        ("ESTRUTURA NUA CALCULADA (ABS/GERR)", "—", "—", "—", 3601.6, 5.40, 0.00, 1.34, "100% da Estrutura Nua Teórica (24,8% de Δ)"),
        ("MARGEM DE CONSTRUÇÃO E CRAVAÇÃO (+12%)", "—", "Cravos / Piche", "—", 432.2, 5.40, 0.00, 1.34, "Fixações galvanizadas, calafeto de estopa e resina"),
        ("TOTAL DO ARRANJO ESTRUTURAL (LIGHTSHIP)", "—", "—", "—", 4033.8, 5.40, 0.00, 1.34, "27,8% do Deslocamento Pleno (14.500 kg)")
    ]
    
    tot_est = 3601.6
    
    for row in itens:
        nome = row[0]
        if row[1] == "":
            r = [Paragraph(f"<b>{nome}</b>", table_cell_grp)] + [Paragraph("", table_cell)]*8 + [Paragraph(f"<i>{row[9]}</i>", table_cell)]
            t_data.append(r)
            continue
            
        w = float(row[4])
        lcg = float(row[5])
        tcg = float(row[6])
        vcg = float(row[7])
        crit = row[8]
        
        if "SUBTOTAL" in nome or "TOTAL" in nome or "ESTRUTURA NUA" in nome or "MARGEM" in nome:
            pct_str = f"{(w/tot_est)*100:.1f}%" if "SUBTOTAL" in nome else ("—" if "MARGEM" in nome else "100%")
            if "TOTAL" in nome: pct_str = "—"
            r = [
                Paragraph(f"<b>{nome}</b>", table_cell_b),
                Paragraph(f"<b>{row[1]}</b>", table_cell_b),
                Paragraph(f"<b>{row[2]}</b>", table_cell_b),
                Paragraph(f"<b>{row[3]}</b>", table_cell_b),
                Paragraph(f"<b>{w:.1f} kg</b>", table_cell_b),
                Paragraph(f"<b>{pct_str}</b>", table_cell_b),
                Paragraph(f"<b>{lcg:.2f} m</b>", table_cell_b),
                Paragraph(f"<b>{tcg:.2f} m</b>", table_cell_b),
                Paragraph(f"<b>{vcg:.2f} m</b>", table_cell_b),
                Paragraph(f"<b>{crit}</b>", table_cell_b)
            ]
            t_data.append(r)
            continue
            
        pct = (w / tot_est) * 100.0
        r = [
            Paragraph(nome, table_cell),
            Paragraph(row[1], table_cell_c),
            Paragraph(row[2], table_cell_c),
            Paragraph(row[3], table_cell_c),
            Paragraph(f"{w:.1f}", table_cell_c),
            Paragraph(f"{pct:.1f}%", table_cell_c),
            Paragraph(f"{lcg:.2f}", table_cell_c),
            Paragraph(f"{tcg:+.2f}" if tcg != 0 else "0,00", table_cell_c),
            Paragraph(f"{vcg:.2f}", table_cell_c),
            Paragraph(crit, table_cell)
        ]
        t_data.append(r)
        
    col_widths = [5.6*cm, 2.2*cm, 2.5*cm, 1.4*cm, 1.8*cm, 1.3*cm, 1.4*cm, 1.4*cm, 1.4*cm, 8.3*cm]
    t = Table(t_data, colWidths=col_widths)
    t.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), 1.5),
        ('BOTTOMPADDING', (0,0), (-1,-1), 1.5),
        ('BACKGROUND', (0,-1), (-1,-1), azul_claro),
    ]))
    
    story.append(t)
    story.append(Spacer(1, 0.2*cm))
    
    story.append(Paragraph("NOTAS DE VERIFICAÇÃO E CONFORMIDADE ESTRUTURAL", h2_style))
    notas_txt = (
        "• <b>Chapeamento de Fundo e Costado:</b> As espessuras adotadas (25 mm no fundo e 28 mm no costado) cumprem com folga os mínimos da Seção 7.5 do ABS e as tensões admissiveis de madeira de lei (σa = 0,4 MOR). Fatores de segurança: FS fundo = 2,77; FS costado = 2,95.<br/>"
        "• <b>Reforços Transversais (Cavernas):</b> Módulo de seção adotado (SM = 152,1 cm³) excede o exigido pela Eq. 8.1.3 do ABS (133,9 cm³). O espaçamento estreito de 387 mm (30 cavernas) reduz a flexão do tabuado e garante rigidez à torção sob esforço da vela de pena.<br/>"
        "• <b>Anteparas de Colisão:</b> As anteparas a 9,7% de LOA de vante e ré atendem à recomendação clássica de segurança contra abalroamento e alagamento (faixa usual de 5% a 10% do comprimento).<br/>"
        "• <b>Centro de Gravidade Estrutural:</b> O CG da estrutura pura situa-se em LCG = 5,40 m e VCG = 1,34 m, perfeitamente compatível com o Centro de Carena LCB = 5,32 m da Tabela V4, mantendo a atitude nivelada do saveiro."
    )
    story.append(Paragraph(notas_txt, body_style))
    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 de Arranjo Estrutural — Brana Projetos Navais / Estaleiro Escola Embrião.</i>", ParagraphStyle('RodFinal', parent=body_style, fontSize=7, textColor=colors.HexColor('#6B7280'), alignment=1)))
    
    doc.build(story)

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