#!/usr/bin/env python3
"""
Window 20x60mm - simplificada.
Baseia-se nos dados de slice do STL original.
Estrutura:
- Z=0-3.2: Simétrica - perímetro com furo que fecha gradualmente
- Z=3.2-4.8: Só lado esquerdo
Usa extrudes simples (sem loft) pra garantir geometria válida.
"""
from build123d import *
import os

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

W = 33.9
H = 13.9
T = 4.8

# Dados das fatias:
# Z=0.0: frame 33.1x13.1, furo obround 17x9mm
# Z=1.6: frame 33.1x13.1, furo 5x5mm  
# Z=3.2: sólido 28.7x9.9mm (sem furo)
# Z=3.6: X=-16.3..+7.2 (esquerda largo, direita fino)
# Z=4.8: X=-14.5..+1.9 (16.4x9.9, só esquerda)

# 1. Z=0 a Z=1.6: frame completo com furo obround
outer = Rectangle(W, H)
outer = fillet(outer.vertices(), 0.5)
hole = Rectangle(17, 9)
hole = fillet(hole.vertices(), 4.5)
sk = outer - hole
base = extrude(sk, 1.6)

# 2. Z=1.6 a Z=3.2: frame vai afinando. 
# Simplificando: dois extrusos - a moldura externa afina
# Parte externa vai de 33.1 pra 28.7 em X e 13.1 pra 9.9 em Y
# O furo interno vai de 17x9 pra 0 (fecha)

# Subdivido em duas camadas pra aproximar o taper:
# Camada 2a: Z=1.6 a Z=2.4 - frame com furo menor, exterior levemente menor
outer2a = Rectangle(31.0, 11.5)
outer2a = fillet(outer2a.vertices(), 0.5)
hole2a = Rectangle(10, 6)
hole2a = fillet(hole2a.vertices(), 3)
sk2a = outer2a - hole2a
layer2a = extrude(sk2a, 0.8)
layer2a = Pos(0, 0, 1.6) * layer2a

# Camada 2b: Z=2.4 a Z=3.2 - frame com furo pequeno
outer2b = Rectangle(28.7, 9.9)
outer2b = fillet(outer2b.vertices(), 0.5)
hole2b = Rectangle(5, 5)
hole2b = fillet(hole2b.vertices(), 2.0)
sk2b = outer2b - hole2b
layer2b = extrude(sk2b, 0.8)
layer2b = Pos(0, 0, 2.4) * layer2b

# 3. Z=3.2 a Z=4.0: transição para só lado esquerdo
# Nesta camada, o lado direito vai desaparecendo
# Simplifico como extruso da forma final em Z=4.0
outer3 = Rectangle(21.0, 9.9)
outer3 = fillet(outer3.vertices(), 0.5)
outer3 = Pos(-5.5, 0) * outer3  # deslocado pra esquerda
layer3 = extrude(outer3, 0.8)
layer3 = Pos(0, 0, 3.2) * layer3

# 4. Z=4.0 a Z=4.8: só colar esquerdo final
outer4 = Rectangle(16.4, 9.9)
outer4 = fillet(outer4.vertices(), 0.5)
outer4 = Pos(-6.3, 0) * outer4
layer4 = extrude(outer4, 0.8)
layer4 = Pos(0, 0, 4.0) * layer4

# COMBINAR
body = base + layer2a + layer2b + layer3 + layer4

# FILE TES VERTICAIS
try:
    ve = body.edges().filter_by_position(Axis.X, 0.1, 0.9)
    body = fillet(ve, 0.2)
except: pass

for zh in [1.6, 2.4, 3.2, 4.0]:
    try:
        e = body.edges().filter_by_position(Axis.Z, zh-0.05, zh+0.05)
        body = fillet(e, 0.15)
    except: pass

# EXPORTAR
stp = os.path.join(OUT, "window_correct2.stp")
stl = os.path.join(OUT, "window_correct2.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_correct2.stp")
