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_atualizado(pdf_path):
    doc = SimpleDocTemplate(
        pdf_path,
        pagesize=A4,
        leftMargin=1.4*cm,
        rightMargin=1.4*cm,
        topMargin=1.3*cm,
        bottomMargin=1.3*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=14.5, leading=18, 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=6, spaceAfter=3)
    body_style = 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.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)

    story = []
    
    # Cabeçalho
    story.append(Paragraph("EXERCÍCIO DE PESOS E CG 3D (ATUALIZADO: LASTRO DE 550 kg)", 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:</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=4))
    
    # Premissa do Lastro Baixo
    story.append(Paragraph("1. Premissa Específica de Projeto: Lastro Fixo de 550 kg na Linha de Base", h2_style))
    prem_txt = (
        "Conforme especificação do projeto tradicional, o saveiro utiliza um lastro fixo de <b>550 kg</b> de lingotes de chumbo fundido "
        "posicionados no ponto mais baixo possível do casco (<b>VCG = 0,08 m</b>, diretamente encaixado entre a quilha maciça e a sobrequilha).<br/>"
        "• <b>Por que apenas 550 kg de lastro fixo?</b> Os saveiros tradicionais da Bahia confiam primordialmente na <b>estabilidade de forma</b> "
        "(garantida pela boca generosa de 4,36 m) e na carga útil de porão. O lastro de 550 kg atua como 'lastro de lastro' para aprumo de linha de centro, "
        "mantendo o peso leve da embarcação para varação em praias de maré e baixo calado operacional."
    )
    story.append(Paragraph(prem_txt, body_style))
    story.append(Spacer(1, 0.15*cm))
    
    # Tabela Completa Atualizada
    story.append(Paragraph("2. Tabela Completa de Pesos, Centros (LCG, TCG, VCG) e Momentos Estáticos", 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>Localização / Posiçã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² tábuas de cedro/louro"),
        ("2. Chapeamento Costado BB (28 mm)", "310", "5,55", "1.720,5", "-1,85", "-573,5", "1,65", "511,5", "Bordo de Bombordo (BB)"),
        ("3. Chapeamento Costado BE (28 mm)", "310", "5,55", "1.720,5", "+1,85", "+573,5", "1,65", "511,5", "Bordo de Boreste (BE)"),
        ("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 e 30 vaus"),
        ("8. Anteparas de Colisão (2x 28 mm)", "174", "3,50", "609,0", "0,00", "0,0", "1,52", "264,5", "Vante (10,84m) e Ré (1,16m)"),
        ("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 (Mínimo)", "550", "5,20", "2.860,0", "0,00", "0,0", "0,08", "44,0", "Sobre a quilha no ponto mais baixo!"),
        ("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 e aparelho de içar"),
        ("12. Motor Diesel 40 HP e Eixo", "380", "3,20", "1.216,0", "0,00", "0,0", "0,75", "285,0", "No poço de ré da casaria"),
        ("13. Tanque de Diesel (300 L)", "260", "3,80", "988,0", "-0,45", "-117,0", "0,60", "156,0", "Tanque estrutural a Bombordo"),
        ("14. Tanque de Água Doce (400 L)", "400", "6,80", "2.720,0", "+0,45", "+180,0", "0,55", "220,0", "Tanque estrutural a Boreste"),
        ("15. 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 Útil Comercial / Porão", "6.832", "5,35", "36.551,2", "0,00", "0,0", "0,80", "5.465,6", "Estivada no porão central"),
        ("TOTAL GERAL (DESLOCAMENTO PLENO)", "14.500 kg", "—", "77.054 kgf·m", "—", "-1,0 kgf·m", "—", "17.119 kgf·m", "Condição Plena de Carga")
    ]
    
    for r in rows_ex:
        is_tot = "TOTAL GERAL" 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.4*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))
    
    # Análise das Respostas do Exercício
    story.append(Paragraph("3. Resultados do Equilíbrio e Diagnóstico de Estabilidade", h2_style))
    res_txt = (
        "<b>A. Coordenadas do Baricentro Total (G):</b><br/>"
        "• <b>LCG = 77.054 / 14.500 = 5,314 m da popa</b> (44,3% do LOA). Alinhado com o Centro de Carena LCB = 5,320 m (diferença residual de apenas 6 mm!).<br/>"
        "• <b>TCG = -1,0 / 14.500 = -0,0001 m ≈ 0,00 m</b> (Banda nula, simetria transversal perfeita).<br/>"
        "• <b>VCG (KG) = 17.119 / 14.500 = 1,180 m acima da linha de base</b>.<br/><br/>"
        "<b>B. Diagnóstico da Redução de Lastro para 550 kg:</b><br/>"
        "• O VCG do lastro foi alocado no ponto mais baixo possível (<b>VCG = 0,08 m</b>, diretamente na quilha).<br/>"
        "• Como o lastro fixo foi reduzido de 4.200 kg para 550 kg, o centro de gravidade total subiu moderadamente de 1,08 m para <b>1,18 m</b>.<br/>"
        "• <b>Altura Metacêntrica Resultante (GMt):</b> Com $KM = 2,30\\text{ m}$, a nova altura metacêntrica é:<br/>"
        "$$GM_t = KM - KG = 2,30\\text{ m} - 1,18\\text{ m} = \\mathbf{1,12\\text{ m}}$$<br/>"
        "Mesmo com o lastro leve de 550 kg, o valor de <b>GMt = 1,12 m</b> é mais do que o triplo do mínimo exigido pela NORMAM-211 (0,35 m), "
        "comprovando a genialidade da arquitetura dos saveiros da Bahia: a boca de 4,36 m confere tanta estabilidade de forma que o barco não precisa ser sobrecarregado com toneladas de lastro morto de chumbo!"
    )
    story.append(Paragraph(res_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>Gabarito e Exercício Prático emitidos para o Grupo 2 — 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_atualizado('/home/magdalena/eee/alunos/carlos-silva/grupo-2-tesouro-da-baia/Exercicio_Pesos_e_Centros_CG_Grupo2.pdf')
