#!/usr/bin/env python3
"""
Porta-trecos "RAYSSA" — formato copo
Copo organizador (boca maior que a base) com nome gravado na lateral.
"""
from build123d import *

# === Parâmetros ===
ALTURA = 100          # Z — altura do copo
R_INF = 55            # raio externo na base
R_TOP = 65            # raio externo no topo
PAREDE = 3.5          # espessura da parede

TEXTO = "RAYSSA"
TAM_FONTE = 20
PROF_GRAVURA = 2.2    # profundidade do relevo (mm)
ALT_TEXTO = 42        # altura do centro do texto a partir da base

# === Perfil do copo (seção transversal) ===
r_inf_in = R_INF - PAREDE
r_top_in = R_TOP - PAREDE

with BuildPart() as copo:
    with BuildSketch(Plane.XZ):
        with BuildLine():
            Line((r_inf_in, 0), (r_top_in, ALTURA))        # parede interna
            Line((r_top_in, ALTURA), (R_TOP, ALTURA))      # borda superior
            Line((R_TOP, ALTURA), (R_INF, 0))              # parede externa
            Line((R_INF, 0), (r_inf_in, 0))                # fundo
        make_face()
    revolve(axis=Axis.Z, revolution_arc=360)

# === Texto "RAYSSA" gravado na lateral ===
# Técnica: extrudar o texto, intersectar com uma casca cilíndrica na
# curvatura do copo, e subtrair — o relevo acompanha a superfície curva.

try:
    texto_sketch = Text(TEXTO, TAM_FONTE, align=(Align.CENTER, Align.CENTER), font="DejaVu Sans")
except Exception:
    texto_sketch = Text(TEXTO, TAM_FONTE, align=(Align.CENTER, Align.CENTER))

# Extrudar texto (inicialmente no plano XY, eixo +Z)
texto_solid = extrude(texto_sketch, 12)
# Rotacionar: texto em pé, voltado para a frente (+Y)
# Rotação -90° em X: extrusão +Z vira +Y (para fora do copo)
texto_solid = texto_solid.rotate(Axis.X, -90)

# Raio da parede externa na altura do texto (interpolação linear do cone)
r_texto = R_INF + (R_TOP - R_INF) * ALT_TEXTO / ALTURA

# Posicionar: face de trás do texto dentro da parede (r_texto - PROF - 0.5)
# e o corpo do texto se estende para fora, atravessando a superfície
texto_solid = texto_solid.translate((0, r_texto - PROF_GRAVURA - 0.5, ALT_TEXTO))

# Casca cilíndrica: da superfície até PROF_GRAVURA para dentro
# ATENÇÃO: alinhar X/Y no centro e Z no mínimo (senão o cilindro fica deslocado)
casca = (
    Cylinder(r_texto + 14, ALTURA, align=(Align.CENTER, Align.CENTER, Align.MIN))
    - Cylinder(r_texto - PROF_GRAVURA, ALTURA, align=(Align.CENTER, Align.CENTER, Align.MIN))
)

# Recortar o texto na curvatura da casca
texto_curvo = texto_solid & casca

# Subtrair do copo → gravação em relevo negativo
resultado = copo.part - texto_curvo

# === Verificações ===
vol_copo = copo.part.volume
vol_grav = texto_curvo.volume
print(f"Volume do copo: {vol_copo:.1f} mm3")
print(f"Volume da gravação: {vol_grav:.1f} mm3")
assert vol_grav > 50, "Gravação vazia — texto não interseptou a parede!"

# === Exportar ===
export_step(resultado, "/app/projects/porta-treco-rayssa/exports/porta_treco_rayssa.step")
export_stl(resultado, "/app/projects/porta-treco-rayssa/exports/porta_treco_rayssa.stl")
print("Modelo copo gerado com sucesso!")
print(f"Dimensões: diam. base {2*R_INF}mm | diam. topo {2*R_TOP}mm | altura {ALTURA}mm | parede {PAREDE}mm")
