import json
import os
import subprocess
import numpy as np

work_dir = '/home/magdalena/eee/alunos/adalfredo-oliveira-santanna-filho'
os.chdir(work_dir)

# Vamos carregar o projeto.json para extrair as curvas e a super-elipse
with open("projeto.json", "r") as f:
    proj = json.load(f)

loa_m = proj["loa_m"] # 8.50 m
loa_sq = proj["loa_sq"] # 34 qd
scale_m_per_sq = loa_m / loa_sq # 0.25 m/qd -> 250 mm/qd

# 8 balizas igualmente espaçadas ao longo do casco
# x em metros: 0, 1.214, 2.429, 3.643, 4.857, 6.071, 7.286, 8.500
# ou 8 estações em milímetros de 0 a 8500 mm
num_balizas = 8
x_vals_mm = np.linspace(0, 8500, num_balizas)

# Funções das curvas cúbicas de Hermite do projeto.json
def eval_hermite(pts, x_sq):
    # pts: [[x, y, m], ...]
    if x_sq <= pts[0][0]:
        return pts[0][1]
    if x_sq >= pts[-1][0]:
        return pts[-1][1]
    for i in range(len(pts) - 1):
        x0, y0, m0 = pts[i]
        x1, y1, m1 = pts[i+1]
        if x0 <= x_sq <= x1:
            dx = x1 - x0
            if dx == 0:
                return y0
            t = (x_sq - x0) / dx
            h00 = 2*t**3 - 3*t**2 + 1
            h10 = t**3 - 2*t**2 + t
            h01 = -2*t**3 + 3*t**2
            h11 = t**3 - t**2
            return h00 * y0 + h10 * m0 * dx + h01 * y1 + h11 * m1 * dx
    return pts[-1][1]

p_mid = proj["cheia"]["p"] # 2.15
mid_x_sq = proj["mid_x"] # 16.0

def full_at(x_sq):
    if x_sq <= mid_x_sq:
        r = x_sq / mid_x_sq
        f = 0.90 + 0.10 * (3*r**2 - 2*r**3)
    else:
        r = (x_sq - mid_x_sq) / (loa_sq - mid_x_sq)
        f = 1.00 - 0.40 * (3*r**2 - 2*r**3)
    return max(1.05, p_mid * f)

lines = []
lines.append("# Plano de linhas, casco redondo — tabela de cotas")
lines.append(f"# Embarcação 8,50 m — Projetista: Adalfredo Oliveira Santanna Filho")
lines.append("# meias-bocas a partir da linha de centro, alturas acima da linha de base (em milímetros)")
lines.append("baliza\tx\taltura_quilha\taltura_borda\tmb_25pc\tmb_50pc\tmb_75pc\tmeia_boca_borda")

for i, x_mm in enumerate(x_vals_mm):
    baliza_num = i + 1
    x_sq = x_mm / 250.0
    
    plan_sheer_sq = eval_hermite(proj["curvas"]["planSheer"], x_sq)
    prof_sheer_sq = eval_hermite(proj["curvas"]["profSheer"], x_sq)
    prof_keel_sq = eval_hermite(proj["curvas"]["profKeel"], x_sq)
    
    mb_borda_mm = max(0.0, plan_sheer_sq * 250.0)
    alt_borda_mm = prof_sheer_sq * 250.0
    alt_quilha_mm = prof_keel_sq * 250.0
    
    # Se x for na proa extrema (última baliza), tudo fecha em 0 meia-boca
    if i == num_balizas - 1 or mb_borda_mm < 1.0:
        mb_borda_mm = 0.0
        mb_25 = 0.0
        mb_50 = 0.0
        mb_75 = 0.0
        alt_quilha_mm = alt_borda_mm
    else:
        p_local = full_at(x_sq)
        # super-elipse: (y / Y)^p + (1 - z_frac)^p = 1 => y = Y * (1 - (1 - z_frac)^p)^(1/p)
        # onde z_frac = 0.25, 0.50, 0.75 do pontal local
        mb_25 = mb_borda_mm * (1.0 - (1.0 - 0.25)**p_local)**(1.0 / p_local)
        mb_50 = mb_borda_mm * (1.0 - (1.0 - 0.50)**p_local)**(1.0 / p_local)
        mb_75 = mb_borda_mm * (1.0 - (1.0 - 0.75)**p_local)**(1.0 / p_local)
        
    lines.append(f"{baliza_num}\t{int(round(x_mm))}\t{int(round(alt_quilha_mm))}\t{int(round(alt_borda_mm))}\t{int(round(mb_25))}\t{int(round(mb_50))}\t{int(round(mb_75))}\t{int(round(mb_borda_mm))}")

tabela_content = "\n".join(lines) + "\n"

with open("tabela_cotas_adalfredo.txt", "w") as f:
    f.write(tabela_content)

print("Tabela de cotas gerada:")
print(tabela_content)

# Executar o gerador 3D
skill_3d_script = "/home/magdalena/.hermes/plugins/iarquiteto-naval-brana/skills/brana-casco-3d-interativo/scripts/gerar-casco-3d.js"
cmd_3d = [
    "node", skill_3d_script,
    "--tabela=tabela_cotas_adalfredo.txt",
    "--nome=Adalfredo Oliveira Santanna Filho",
    "--saida=."
]

res_3d = subprocess.run(cmd_3d, capture_output=True, text=True)
print("Gerador 3D stdout:\n", res_3d.stdout)
print("Gerador 3D stderr:\n", res_3d.stderr)

