"""USB plug corridor for the flipped camera (correct correspondence map: RAW loads only)."""
import numpy as np, trimesh, trimesh.repair

def LR(f):
    m = trimesh.load(f, force="mesh")
    if not m.is_volume:
        m.merge_vertices(merge_tex=True, merge_norm=True)
        m.update_faces(m.nondegenerate_faces()); m.update_faces(m.unique_faces())
        trimesh.repair.fill_holes(m); m.fix_normals()
    return m

T = np.load("/tmp/T_auth_to_v2.npy")
print("using verified chain transform")
cor = trimesh.creation.box(extents=[7.6 + 9, 3.8 + 9, 50.0])
cor.apply_translation([(-10.8 - 3.2) / 2, (-15.6 - 11.8) / 2, -50.0 / 2 - 3.0])   # ORIGINAL socket (rigid rebuild)
cor.apply_transform(T)
piece = LR("gripper_v2_print_fixed_umi.stl")
blocked = trimesh.boolean.intersection([cor, piece], engine="manifold")
print("material inside USB corridor:", round(blocked.volume / 1000, 2), "cm3")
piece = trimesh.boolean.difference([piece, cor], engine="manifold")
body = LR("gnode_v2_camera_body.stl")
blob = trimesh.boolean.intersection([body, piece], engine="manifold")
if blob.volume > 1.0:
    V = blob.convex_hull.vertices
    offs = [d * s for d in np.eye(3) for s in (1.5, -1.5)]
    relief = trimesh.PointCloud(np.vstack([V + o for o in offs])).convex_hull
    piece = trimesh.boolean.difference([piece, relief], engine="manifold")
    print("seat relief re-carved:", round(blob.volume / 1000, 3), "cm3 blob")
check = trimesh.boolean.intersection([body, piece], engine="manifold")
print("body/piece after carves:", round(check.volume / 1000, 4), "cm3")
bodies = piece.split(only_watertight=False)
keep = [b for b in bodies if b.volume > 100.0]
out = keep[0] if len(keep) == 1 else trimesh.util.concatenate(keep)
nb = len(out.split(only_watertight=False))
out.export("gripper_v2_print_fixed_umi.stl")
print("final piece: wt=", out.is_watertight, "bodies=", nb, "vol=", round(out.volume / 1000, 1), "cm3")
