#!/usr/bin/env python3
"""Analyze original STL cross-sections to understand the design."""
import struct, numpy as np

def load_stl(path):
    with open(path, "rb") as f:
        f.read(80)
        n = struct.unpack("<I", f.read(4))[0]
        tris = []
        for _ in range(n):
            f.read(12)
            pts = []
            for _ in range(3):
                x, y, z = struct.unpack("<fff", f.read(12))
                pts.append([x, y, z])
            f.read(2)
            tris.append(pts)
    return np.array(tris)

def analyze(tris, z_val, label):
    norm = tris.copy()
    norm -= norm.reshape(-1, 3).min(axis=0)
    mask = np.abs(norm[:,:,2] - z_val).min(axis=1) < 0.2
    if mask.sum() == 0:
        return
    pts = norm[mask].reshape(-1, 3)
    x_vals = np.unique(np.round(pts[:,0], 1))
    y_vals = np.unique(np.round(pts[:,1], 1))
    def cluster(vals, gap=2.0):
        if len(vals) == 0: return []
        clusters = [[vals[0]]]
        for v in vals[1:]:
            if v - clusters[-1][-1] < gap:
                clusters[-1].append(v)
            else:
                clusters.append([v])
        return [(min(c), max(c)) for c in clusters]
    xc = cluster(x_vals)
    yc = cluster(y_vals)
    print("  %s Z=%.1f:" % (label, z_val))
    for i, (a,b) in enumerate(xc):
        print("    X[%d]: %.1f - %.1f (%.1fmm)" % (i, a, b, b-a))
    for i, (a,b) in enumerate(yc):
        print("    Y[%d]: %.1f - %.1f (%.1fmm)" % (i, a, b, b-a))

# === BOX ===
print("=== BOX (base) ===")
box = load_stl("original/Box.stl")
print("Overall: %.1f x %.1f x %.1fmm" % (box[:,:,0].max(), box[:,:,1].max(), box[:,:,2].max()))
for z in [0.5, 5.0, 10.0, 14.0, 16.5]:
    analyze(box, z, "Z")

# === LID ===
print("\n=== LID ===")
lid = load_stl("original/Lid.stl")
print("Overall: %.1f x %.1f x %.1fmm" % (lid[:,:,0].max(), lid[:,:,1].max(), lid[:,:,2].max()))
for z in [0.5, 2.0, 5.0, 8.0, 9.5]:
    analyze(lid, z, "Z")

# === WINDOW ===
print("\n=== WINDOW 20x60mm ===")
win = load_stl("original/Window 20x60mm.stl")
print("Overall: %.1f x %.1f x %.1fmm" % (win[:,:,0].max(), win[:,:,1].max(), win[:,:,2].max()))
for z in [0.5, 2.4, 4.5]:
    analyze(win, z, "Z")

print("\n=== SCREW ===")
screw = load_stl("original/Screw.stl")
print("Overall: %.1f x %.1f x %.1fmm" % (screw[:,:,0].max(), screw[:,:,1].max(), screw[:,:,2].max()))
