#!/usr/bin/env python3
"""Build the smooth window from slice data with correct taper geometry."""
from build123d import *
import os

OUT = "/app/projects/esp32-box/exports"
os.makedirs(OUT, exist_ok=True)

# Dados das fatias:
# Z=0 a Z=1.2: Frame 33.1x13.1mm com furo retangular ~28x8mm (paredes ~2.5mm)
# Z=1.6: Xgap=-10-10 Ygap=- (furo fecha em Y, vira 2 pilares laterais)
# Z=3.2: outer 29.9x9.9mm, Xgap=-10-10, Ygap=-

# Construir em 3 camadas com transição gradual

# 1. BASE FRAME (Z=0 a Z=1.2)
outer0 = Rectangle(33.1, 13.1)
outer0 = fillet(outer0.vertices(), 0.5)

# Furo retangular na base (28x8mm centrado)
hole0 = Rectangle(28, 8)
hole0 = fillet(hole0.vertices(), 1.0)

sk0 = outer0 - hole0
base = extrude(sk0, 1.2)

# 2. TRANSIÇÃO (Z=1.2 a Z=1.6) - frame para pilares
# Em Z=1.2: frame com furo 28x8 (mesmo da base)
# Em Z=1.6: furo 20mm X, sem gap em Y
# Para simplificar: extruso da seção em Z=1.6

# Seção em Z=1.6: dois pilares com gap X=-10 a +10, Y cheio
# Pilar esquerdo: X=-16.5 a X=-10 (6.5mm), Y=-6.6 a 6.5 (13.1mm)
lp = Rectangle(6.5, 13.1)
lp = fillet(lp.vertices(), 0.3)
lp = Pos(-13.25, 0) * lp  # centro em (-16.5 + -10)/2 = -13.25

rp = Rectangle(6.6, 13.1)
rp = fillet(rp.vertices(), 0.3)
rp = Pos(13.3, 0) * rp  # centro em (10 + 16.6)/2 = 13.3

pilar_secao = lp + rp
pilar = extrude(pilar_secao, 0.4)
pilar = Pos(0, 0, 1.2) * pilar

# 3. TOPO (Z=1.6 a Z=3.2) - pilares com taper externo
# Em Z=3.2: outer 29.9x9.9, Xgap=-10-10
# Pilar esquerdo: X=-14.9 a -10 (4.9mm), Y=-5.0 a 4.9 (9.9mm)
lp2 = Rectangle(4.9, 9.9)
lp2 = fillet(lp2.vertices(), 0.3)
lp2 = Pos(-12.45, 0) * lp2  # centro em (-14.9 + -10)/2 = -12.45

rp2 = Rectangle(5.0, 9.9)
rp2 = fillet(rp2.vertices(), 0.3)
rp2 = Pos(12.5, 0) * rp2  # centro em (10 + 15)/2 = 12.5

pilar_top = lp2 + rp2
top = extrude(pilar_top, 1.6)
top = Pos(0, 0, 1.6) * top

# 4. COMBINAR
body = base + pilar + top

# 5. FILETES DE TRANSIÇÃO
for zh in [1.2, 1.6]:
    try:
        e = body.edges().filter_by_position(Axis.Z, zh-0.05, zh+0.05)
        body = fillet(e, 0.2)
    except:
        pass

# 6. EXPORTAR
stp = os.path.join(OUT, "window_smooth.stp")
stl = os.path.join(OUT, "window_smooth.stl")
export_step(body, stp)
export_stl(body, stl)
sz = body.bounding_box().size
print("OK: %.1f x %.1f x %.1f" % (sz.X, sz.Y, sz.Z))
print("STEP: window_smooth.stp")
print("")
print("Estrutura:")
print("  Z=0-1.2: Frame 33.1x13.1 c/ furo 28x8mm")
print("  Z=1.2-1.6: Pilares laterais (6.5mm parede)")
print("  Z=1.6-3.2: Pilares c/ taper (4.9mm parede, 29.9x9.9 outer)")
