import os
from reportlab.lib import colors
from reportlab.lib.pagesizes import A4
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_exercicio_pesos_cg_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')
    
    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'))
    h2_style = ParagraphStyle('DocH2', parent=styles['Heading2'], fontName='Helvetica-Bold', fontSize=10.5, leading=13.5, textColor=azul_brana, spaceBefore=7, spaceAfter=3)
    body_style = ParagraphStyle('DocBody', parent=styles['Normal'], fontName='Helvetica', fontSize=7.8, leading=11, textColor=texto_escuro)
    body_bold = ParagraphStyle('DocBodyB', parent=styles['Normal'], fontName='Helvetica-Bold', fontSize=7.8, leading=11, textColor=texto_escuro)
    table_hdr = ParagraphStyle('TableHdr', parent=styles['Normal'], fontName='Helvetica-Bold', fontSize=7, leading=8.5, textColor=colors.white, alignment=1)
    table_cell = ParagraphStyle('TableCell', parent=styles['Normal'], fontName='Helvetica', fontSize=7, leading=8.5, textColor=texto_escuro)
    table_cell_c = ParagraphStyle('TableCellC', parent=styles['Normal'], fontName='Helvetica', fontSize=7, leading=8.5, textColor=texto_escuro, alignment=1)
    table_cell_b = ParagraphStyle('TableCellB', parent=styles['Normal'], fontName='Helvetica-Bold', fontSize=7, leading=8.5, textColor=azul_brana, alignment=1)

    story = []
    
    # Cabeçalho
    story.append(Paragraph("EXERCÍCIO PRÁTICO: ESTUDO DE PESOS, CENTROS (LCG, TCG, VCG) E EQUILÍBRIO", title_style))
    story.append(Paragraph("<b>Curso de Design Profissional de Embarcações</b> · Estaleiro Escola Embrião (EEE) & Brana Projetos Navais", sub_style))
    story.append(Paragraph("<b>Embarcação de Estudo:</b> Saveiro Tradicional 'Tesouro da Baía' (12,00 m) · <b>Grupo 2:</b> Carlos Silva, Cauã e Alessandra", sub_style))
    story.append(Spacer(1, 0.15*cm))
    story.append(HRFlowable(width="100%", thickness=1.5, color=azul_brana, spaceBefore=1, spaceAfter=5))
    
    # Objetivos e Teoria
    story.append(Paragraph("1. Objetivo do Exercício e Convenção do Sistema de Coordenadas 3D", h2_style))
    obj_txt = (
        "O objetivo deste exercício é calcular o centro de gravidade tridimensional final ($G$) da embarcação em condição de carga plena "
        "e verificar o equilíbrio hidrostático (Trim, Banda e Estabilidade Inicial $GM_t$).<br/>"
        "• <b>Eixo X (Longitudinal):</b> Origem no espelho de popa ($X = 0,00\\text{ m}$), positivo para a proa ($LCG$).<br/>"
        "• <b>Eixo Y (Transversal):</b> Origem na Linha de Centro ($CL = 0,00\\text{ m}$), Bombordo negativo ($-$) e Boreste positivo ($+$) ($TCG$).<br/>"
        "• <b>Eixo Z (Vertical):</b> Origem na Linha de Base no ponto mais baixo da quilha ($Z = 0,00\\text{ m}$) ($VCG$ ou $KG$)."
    )
    story.append(Paragraph(obj_txt, body_style))
    story.append(Spacer(1, 0.2*cm))
    
    # Fórmulas
    story.append(Paragraph("2. Fórmulas de Cálculo dos Momentos e Posições do Baricentro", h2_style))
    form_txt = (
        "$$\\text{Massa Total: } M_{total} = \\sum M_i \\quad \\Bigg| \\quad "
        "LCG = \\frac{\\sum (M_i \\cdot LCG_i)}{M_{total}} \\quad \\Bigg| \\quad "
        "TCG = \\frac{\\sum (M_i \\cdot TCG_i)}{M_{total}} \\quad \\Bigg| \\quad "
        "VCG = \\frac{\\sum (M_i \\cdot VCG_i)}{M_{total}}$$"
    )
    story.append(Paragraph(form_txt, body_bold))
    story.append(Spacer(1, 0.2*cm))
    
    # Tabela do Exercício com Valores do Tesouro da Baía
    story.append(Paragraph("3. Tabela de Pesos, Braços de Alavanca e Momentos Estáticos (Gabarito de Projeto)", h2_style))
    
    headers = [
        Paragraph("<b>Item / Componente</b>", table_hdr),
        Paragraph("<b>Massa<br/>(kg)</b>", table_hdr),
        Paragraph("<b>LCG<br/>(m)</b>", table_hdr),
        Paragraph("<b>Mom. X<br/>(kgf·m)</b>", table_hdr),
        Paragraph("<b>TCG<br/>(m)</b>", table_hdr),
        Paragraph("<b>Mom. Y<br/>(kgf·m)</b>", table_hdr),
        Paragraph("<b>VCG<br/>(m)</b>", table_hdr),
        Paragraph("<b>Mom. Z<br/>(kgf·m)</b>", table_hdr),
        Paragraph("<b>Função / Localização a Bordo</b>", table_hdr)
    ]
    
    t_data = [headers]
    
    rows_ex = [
        ("1. Chapeamento de Fundo (25 mm)", "585", "5,10", "2.983,5", "0,00", "0,0", "0,42", "245,7", "36,0 m² madeira dura submersa"),
        ("2. Chapeamento Costado BB (28 mm)", "310", "5,55", "1.720,5", "-1,85", "-573,5", "1,65", "511,5", "17,05 m² bordo de Bombordo"),
        ("3. Chapeamento Costado BE (28 mm)", "310", "5,55", "1.720,5", "+1,85", "+573,5", "1,65", "511,5", "17,05 m² bordo de Boreste"),
        ("4. Espelho de Popa Corrigido (16 mm)", "74", "0,08", "5,9", "0,00", "0,0", "1,80", "133,2", "Área real de 2,35 m²"),
        ("5. Convés e Trincaniz (16 mm)", "195", "5,80", "1.131,0", "0,00", "0,0", "2,15", "419,3", "18,75 m² tábuas de convés"),
        ("6. Reforços Longitudinais e Quilha", "610", "5,22", "3.184,2", "0,00", "0,0", "0,40", "244,0", "Quilha 150×150 + 12 longitudinais"),
        ("7. Cavernas, Vaus e Hastilhas", "1.344", "5,50", "7.392,0", "0,00", "0,0", "1,54", "2.069,8", "30 cavernas transversais completas"),
        ("8. Anteparas de Colisão (2x 28 mm)", "174", "3,50", "609,0", "0,00", "0,0", "1,52", "264,5", "Vante a 10,84 m / Ré a 1,16 m"),
        ("9. Margem Construtiva e Calafeto (+12%)", "416", "5,40", "2.246,4", "0,00", "0,0", "1,35", "561,6", "Cravos de ferro, estopa e resina"),
        ("10. Lastro Fixo de Chumbo/Ferro", "4.200", "5,20", "21.840,0", "0,00", "0,0", "0,20", "840,0", "Lingotes de fundo sobre a quilha"),
        ("11. Mastro Maciço e Vela de Pena", "550", "6,50", "3.575,0", "0,00", "0,0", "6,20", "3.410,0", "Mastro 14,5 m + aparelho de içar"),
        ("12. Motor Diesel 40 HP e Linha de Eixo", "380", "3,20", "1.216,0", "0,00", "0,0", "0,75", "285,0", "Instalado no poço de ré"),
        ("13. Tanque de Diesel (300 L)", "260", "3,80", "988,0", "-0,45", "-117,0", "0,60", "156,0", "A Bombordo (BB)"),
        ("14. Tanque de Água Doce (400 L)", "400", "6,80", "2.720,0", "+0,45", "+180,0", "0,55", "220,0", "A Boreste (BE)"),
        ("15. Banco de Baterias 12V (2x 150Ah)", "75", "3,40", "255,0", "+0,40", "+30,0", "0,85", "63,8", "Compensação de banda a Boreste"),
        ("16. Mobília, Casaria e Cozinha", "485", "5,20", "2.522,0", "-0,40", "-194,0", "1,35", "654,8", "Acomodações e bancada"),
        ("17. Tripulação e Passageiros (12 pess.)", "960", "5,10", "4.896,0", "0,00", "0,0", "1,90", "1.824,0", "Distribuição no convés"),
        ("18. Carga Comercial / Olaria / Rancho", "2.869", "5,35", "15.349,2", "0,00", "0,0", "0,80", "2.295,2", "Paiol de carga sobre o estrado"),
        ("SOMATÓRIOS FINAIS", "14.500 kg", "—", "76.434 kgf·m", "—", "-2,0 kgf·m", "—", "15.654 kgf·m", "Condição Plena de Carga")
    ]
    
    for r in rows_ex:
        is_tot = "SOMATÓRIOS" in r[0]
        st_c = table_cell_b if is_tot else table_cell_c
        row_cells = [
            Paragraph(f"<b>{r[0]}</b>" if is_tot else r[0], table_cell_b if is_tot else table_cell),
            Paragraph(f"<b>{r[1]}</b>" if is_tot else r[1], st_c),
            Paragraph(r[2], st_c),
            Paragraph(f"<b>{r[3]}</b>" if is_tot else r[3], st_c),
            Paragraph(r[4], st_c),
            Paragraph(r[5], st_c),
            Paragraph(r[6], st_c),
            Paragraph(f"<b>{r[7]}</b>" if is_tot else r[7], st_c),
            Paragraph(r[8], table_cell)
        ]
        t_data.append(row_cells)
        
    col_widths = [4.3*cm, 1.6*cm, 1.2*cm, 1.8*cm, 1.2*cm, 1.7*cm, 1.2*cm, 1.8*cm, 3.2*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,-2), [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))
    
    # 4. Questões e Análise de Equilíbrio
    story.append(Paragraph("4. Resolução das Questões do Exercício (Verificação Hidrostática)", h2_style))
    quest_txt = (
        "<b>Questão A — Coordenadas Finais do Centro de Gravidade:</b><br/>"
        "• $LCG = 76.434 / 14.500 = \\mathbf{5,27\\text{ m}}$ da popa.<br/>"
        "• $TCG = -2,0 / 14.500 = \\mathbf{-0,0001\\text{ m}} \\approx \\mathbf{0,00\\text{ m}}$ (Perfeitamente centrado).<br/>"
        "• $VCG (KG) = 15.654 / 14.500 = \\mathbf{1,08\\text{ m}}$ acima da linha de base.<br/><br/>"
        "<b>Questão B — Verificação do Trim Longitudinal:</b><br/>"
        "O Centro de Carena da Tabela V4 no calado de 922 mm é $LCB = 5,32\\text{ m}$. O braço de trim é $(LCB - LCG) = 5,32 - 5,27 = +0,05\\text{ m}$ (5 cm a vante de G), "
        "produzindo um assentamento com caimento suave de popa de apenas <b>Trim = +0,15° a ré</b>, ideal para escoamento do leme.<br/><br/>"
        "<b>Questão C — Altura Metacêntrica Inicial (GMt) e Rigidez:</b><br/>"
        "Com a altura do metacentro transversal $KM = 2,30\\text{ m}$ e $KG = 1,08\\text{ m}$, a altura metacêntrica é:<br/>"
        "$$GM_t = KM - KG = 2,30\\text{ m} - 1,08\\text{ m} = \\mathbf{1,22\\text{ m}}$$<br/>"
        "O valor supera com folga o mínimo regulamentar de 0,35 m da NORMAM-211, garantindo alta estabilidade sob vento forte."
    )
    story.append(Paragraph(quest_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>Exercício prático de arquitetura naval emitido para os alunos do Estaleiro Escola Embrião & Brana Projetos Navais.</i>", ParagraphStyle('RodFinal', parent=body_style, fontSize=7, textColor=colors.HexColor('#6B7280'), alignment=1)))
    
    doc.build(story)

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