#!/usr/bin/env python3
"""
Window 20x60mm - Painel de conexão WAGO.
Recriação paramétrica com dados EXATOS do STL:
- Furo oval central VAZADO EM Z INTEIRO
- Perfis assimétricos: cada lado com altura Z diferente (encaixe)
- 3 níveis de Z em sentidos opostos
"""
from build123d import *
import os, math

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

# ========= DIMENSÕES =========
W = 33.9     # Comprimento X
H = 13.9     # Altura Y
T = 4.8      # Espessura Z total

# Níveis Z (confirmados pela análise)
Z_THIN = 1.6   # Base/bordas finas
Z_MID = 3.2    # Nível intermediário  
Z_MAX = 4.8    # Nível máximo

# Furo oval central (centrado na origem)
HOLE_W = 23.0   # Largura do furo oval (X)
HOLE_H = 9.0    # Altura do furo oval (Y)

# Faixas laterais (fora do furo)
# Esquerda (X negativo)
L_W = 5.0       # Largura faixa esquerda
L_Z = 3.2       # Altura Z mínima
L_ZH = 4.8      # Altura Z máxima

# Direita (X positivo)  
R_W = 5.0
R_Z = 1.6
R_ZH = 3.2

# ========= CONSTRUÇÃO =========

# 1. Placa base fina (Z=0 a Z=1.6)
# Retângulo externo menos furo oval
outer_r = Rectangle(W, H)
outer_r = fillet(outer_r.vertices(), 0.5)

# Furo oval (slot/obround)
hole = Rectangle(HOLE_W, HOLE_H)
hole = fillet(hole.vertices(), HOLE_H/2)  # semicírculos nas pontas

# Base = externo - furo
base_shape = outer_r - hole
base = extrude(base_shape, Z_THIN)

# 2. Faixa esquerda (Z=1.6 a Z=4.8)
left_pad = Rectangle(L_W, H - 1.0)  # altura quase total
left_pad = fillet(left_pad.vertices(), 0.3)
left = extrude(left_pad, L_ZH - Z_THIN)
left = Pos(-W/2 + L_W/2, 0, Z_THIN) * left

# 3. Faixa direita (Z=1.6 a Z=3.2)  
right_pad = Rectangle(R_W, H - 1.0)
right_pad = fillet(right_pad.vertices(), 0.3)
right = extrude(right_pad, R_ZH - Z_THIN)
right = Pos(W/2 - R_W/2, 0, Z_THIN) * right

# 4. Pequenos ressaltos nas bordas superior/inferior
# (os "frisos")
rib_w = 2.0
rib_h = 0.3
rib_d = 2.0  # profundidade em X
for side_y in [-H/2 + 0.5, H/2 - 0.5]:
    rib = Rectangle(W - 4, rib_w)
    rib = fillet(rib.vertices(), 0.3)
    rib_ext = extrude(rib, rib_h)
    rib_ext = Pos(0, side_y, Z_THIN) * rib_ext
    body = base + left + right + rib_ext

# 5. Corpo combinado
try:
    body = base + left + right
except:
    body = base

# NÃO adicionar corpos que não existem ainda
# Juntar tudo
body = base
body += left
body += right

# 6. Ranhuras/frisos nas bordas
N_RIBS = 3
for i in range(N_RIBS):
    spacing = (W - 6) / (N_RIBS + 1)
    rx = -W/2 + 3 + spacing + i * spacing
    
    # Friso na borda superior
    r_top = Pos(rx, H/2 - 0.3/2, Z_THIN/2) * Box(1.2, 0.3, Z_THIN)
    body -= r_top
    
    # Friso na borda inferior
    r_bot = Pos(rx, -H/2 + 0.3/2, Z_THIN/2) * Box(1.2, 0.3, Z_THIN)
    body -= r_bot

# 7. Filetes de transição
try:
    e1 = body.edges().filter_by_position(Axis.Z, Z_THIN-0.1, Z_THIN+0.1)
    body = fillet(e1, 0.2)
except:
    pass

try:
    e2 = body.edges().filter_by_position(Axis.Z, R_ZH-0.05, R_ZH+0.05)
    body = fillet(e2, 0.15)
except:
    pass

# ========= EXPORTAR =========
stp = os.path.join(OUT, "window_connection_final.stp")
stl = os.path.join(OUT, "window_connection_final.stl")
export_step(body, stp)
export_stl(body, stl)

sz = body.bounding_box().size
print("Dimensões: %.1f x %.1f x %.1f" % (sz.X, sz.Y, sz.Z))
print("Estrutura:")
print("  Base/perímetro: Z=0 a Z=%.1f (1.6mm)" % Z_THIN)
print("  Asa esquerda:   Z=%.1f a Z=%.1f (3.2mm)" % (Z_THIN, L_ZH))
print("  Asa direita:    Z=%.1f a Z=%.1f (1.6mm)" % (Z_THIN, R_ZH))
print("  Furo oval:     %.1f x %.1f mm" % (HOLE_W, HOLE_H))
print("  Ranhuras:      %d em cada borda" % N_RIBS)
print()
print("STEP: window_connection_final.stp")
