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_exercicio_ds14_boca_430(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, leading=16, textColor=azul_brana, spaceAfter=2, alignment=1)
    sub_style = ParagraphStyle('DocSub', parent=styles['Normal'], fontName='Helvetica', fontSize=8, leading=10.5, textColor=colors.HexColor('#4B5563'), alignment=1)
    aviso_style = ParagraphStyle('Aviso', parent=styles['Normal'], fontName='Helvetica-Oblique', fontSize=6.5, leading=8.5, textColor=colors.HexColor('#6B7280'), alignment=1)
    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)
    table_cell_bc = ParagraphStyle('TableCellBC', parent=styles['Normal'], fontName='Helvetica-Bold', fontSize=6.8, leading=8.5, textColor=azul_brana, alignment=1)
    resumo_style = ParagraphStyle('Resumo', parent=styles['Normal'], fontName='Helvetica-Bold', fontSize=8.5, leading=12, textColor=azul_brana, alignment=1)

    story = []
    
    story.append(Paragraph("O conteúdo deste material é de uso exclusivo dos alunos matriculados no curso PPE-M1 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.", aviso_style))
    story.append(Spacer(1, 0.15*cm))
    story.append(Paragraph("ESTUDO DE PESO — TABELA PREENCHIDA (EXERCÍCIO DS14)", title_style))
    story.append(Paragraph("<b>Embarcação:</b> Saveiro Tesouro da Baía (12,00 m × 4,30 m) | <b>Grupo 2:</b> Carlos Silva, Cauã e Alessandra Feitosa | <b>Brana / EEE</b>", sub_style))
    story.append(Spacer(1, 0.15*cm))
    story.append(HRFlowable(width="100%", thickness=1.2, color=azul_brana, spaceBefore=1, spaceAfter=4))
    
    headers = [
        Paragraph("<b>Item</b>", table_hdr),
        Paragraph("<b>Material</b>", table_hdr),
        Paragraph("<b>Área<br/>(m²)</b>", table_hdr),
        Paragraph("<b>Peso<br/>(kg)</b>", table_hdr),
        Paragraph("<b>LCG<br/>(m)</b>", table_hdr),
        Paragraph("<b>VCG<br/>(m)</b>", table_hdr),
        Paragraph("<b>TCG<br/>(m)</b>", table_hdr),
        Paragraph("<b>LMON<br/>(kg·m)</b>", table_hdr),
        Paragraph("<b>VMON<br/>(kg·m)</b>", table_hdr),
        Paragraph("<b>TMON<br/>(kg·m)</b>", table_hdr)
    ]
    t_data = [headers]
    
    # 13 linhas oficiais calibradas para BOA = 4,30 m
    # TCG do costado: +/- 1,82 m (centroide da chapa em relação ao CL com boca 4,30 m)
    linhas = [
        ["Costado BB", "Pau-Roxo (Roxinho) 28 mm", "17,00", "308,0", "5,55", "1,65", "-1,82", f"{308.0*5.55:.1f}", f"{308.0*1.65:.1f}", f"{308.0*-1.82:.1f}"],
        ["Costado BE", "Pau-Roxo (Roxinho) 28 mm", "17,00", "308,0", "5,55", "1,65", "+1,82", f"{308.0*5.55:.1f}", f"{308.0*1.65:.1f}", f"{308.0*1.82:.1f}"],
        ["Fundo", "Cedro-Rosa 25 mm + Quilha Massaranduba", "35,50", "970,0", "5,15", "0,35", "0,00", f"{970.0*5.15:.1f}", f"{970.0*0.35:.1f}", "0,0"],
        ["Espelho Popa", "Cedro / Pau-Roxo 16 mm (Área Real)", "2,30", "72,0", "0,08", "1,80", "0,00", f"{72.0*0.08:.1f}", f"{72.0*1.80:.1f}", "0,0"],
        ["Caverna de Proa", "Massaranduba 25×175 mm (Bal. 28)", "1,48", "64,0", "10,84", "1,75", "0,00", f"{64.0*10.84:.1f}", f"{64.0*1.75:.1f}", "0,0"],
        ["Caverna de Popa", "Massaranduba 25×175 mm (Bal. 3)", "3,95", "153,0", "1,16", "1,45", "0,00", f"{153.0*1.16:.1f}", f"{153.0*1.45:.1f}", "0,0"],
        ["Caverna Central", "Massaranduba 25×175 mm (Bal. 6 / Boca 4,3m)", "4,15", "178,0", "6,00", "1,35", "0,00", f"{178.0*6.00:.1f}", f"{178.0*1.35:.1f}", "0,0"],
        ["Plataforma Popa", "Tijupá / Convés de Ré (Louro 16 mm)", "5,40", "64,0", "1,20", "2,10", "0,00", f"{64.0*1.20:.1f}", f"{64.0*2.10:.1f}", "0,0"],
        ["Plataforma Proa", "Convés de Vante e Bico (Louro 16 mm)", "6,10", "74,0", "10,20", "2,30", "0,00", f"{74.0*10.20:.1f}", f"{74.0*2.30:.1f}", "0,0"],
        ["Banco", "Bancadas Laterais de Passageiros", "5,70", "118,0", "5,20", "1,55", "0,00", f"{118.0*5.20:.1f}", f"{118.0*1.55:.1f}", "0,0"],
        ["Tripulante 1", "Mestre / Timoneiro", "—", "80,0", "1,50", "2,20", "-0,30", f"{80.0*1.50:.1f}", f"{80.0*2.20:.1f}", f"{80.0*-0.30:.1f}"],
        ["Tripulante 2", "Proeiro / Marinheiro de Vante", "—", "80,0", "8,50", "2,10", "+0,30", f"{80.0*8.50:.1f}", f"{80.0*2.10:.1f}", f"{80.0*0.30:.1f}"],
        ["Caixa Bolina", "Carlinga do Mastro + Encaixe da Quilha", "1,80", "85,0", "6,40", "0,80", "0,00", f"{85.0*6.40:.1f}", f"{85.0*0.80:.1f}", "0,0"]
    ]
    
    tot_w = sum(float(r[3].replace(',', '.')) for r in linhas)
    tot_lmon = sum(float(r[7].replace(',', '.')) for r in linhas)
    tot_vmon = sum(float(r[8].replace(',', '.')) for r in linhas)
    tot_tmon = sum(float(r[9].replace(',', '.')) for r in linhas)
    
    lcg = tot_lmon / tot_w
    vcg = tot_vmon / tot_w
    tcg = tot_tmon / tot_w
    
    linhas.append([
        "TOTAL", "—", "98,38 m²", f"{tot_w:.1f}", f"{lcg:.2f}", f"{vcg:.2f}", f"{tcg:.2f}",
        f"{tot_lmon:.1f}", f"{tot_vmon:.1f}", f"{tot_tmon:.1f}"
    ])
    
    for row in linhas:
        t_data.append([
            Paragraph(f"<b>{row[0]}</b>" if "TOTAL" in row[0] else row[0], table_cell_b if "TOTAL" in row[0] else table_cell),
            Paragraph(row[1], table_cell_c),
            Paragraph(row[2], table_cell_c),
            Paragraph(f"<b>{row[3]}</b>" if "TOTAL" in row[0] else row[3], table_cell_bc if "TOTAL" in row[0] else table_cell_c),
            Paragraph(row[4], table_cell_bc if "TOTAL" in row[0] else table_cell_c),
            Paragraph(row[5], table_cell_bc if "TOTAL" in row[0] else table_cell_c),
            Paragraph(row[6], table_cell_bc if "TOTAL" in row[0] else table_cell_c),
            Paragraph(f"<b>{row[7]}</b>" if "TOTAL" in row[0] else row[7], table_cell_bc if "TOTAL" in row[0] else table_cell_c),
            Paragraph(f"<b>{row[8]}</b>" if "TOTAL" in row[0] else row[8], table_cell_bc if "TOTAL" in row[0] else table_cell_c),
            Paragraph(f"<b>{row[9]}</b>" if "TOTAL" in row[0] else row[9], table_cell_bc if "TOTAL" in row[0] else table_cell_c)
        ])
        
    col_widths = [3.8*cm, 4.4*cm, 1.8*cm, 1.8*cm, 1.8*cm, 1.8*cm, 1.8*cm, 2.5*cm, 2.5*cm, 2.5*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), 2),
        ('BOTTOMPADDING', (0,0), (-1,-1), 2),
        ('BACKGROUND', (0,-1), (-1,-1), azul_claro),
    ]))
    story.append(t)
    story.append(Spacer(1, 0.25*cm))
    
    txt_resumo = (
        f"<b>Peso total = {tot_w:.1f} kg</b> &nbsp;&nbsp;·&nbsp;&nbsp; "
        f"<b>LCG = LMON ÷ Peso = {lcg:.3f} m</b> &nbsp;&nbsp;·&nbsp;&nbsp; "
        f"<b>VCG = VMON ÷ Peso = {vcg:.3f} m</b> &nbsp;&nbsp;·&nbsp;&nbsp; "
        f"<b>TCG = TMON ÷ Peso = {tcg:+.3f} m ≈ 0,00 m</b>"
    )
    story.append(Paragraph(txt_resumo, resumo_style))
    story.append(Spacer(1, 0.2*cm))
    
    nota_rodape = (
        "<i>Nota técnica (Boca = 4,30 m): Com a boca máxima de 4,30 m, o centroide transversal do costado situa-se a TCG = ±1,82 m da linha de centro. "
        "A simetria construtiva anula perfeitamente o TMON (-560,6 + 560,6 = 0,0 kg·m), garantindo banda nula em repouso.</i>"
    )
    story.append(Paragraph(nota_rodape, aviso_style))
    
    doc.build(story)

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