#!/usr/bin/env python3
"""Analyze Window 20x60mm profile at vertical cuts."""
import struct, numpy as np

path = "/app/projects/esp32-box/original/Window 20x60mm.stl"

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

pts = np.array(pts)
cx, cy = pts[:,0].mean(), pts[:,1].mean()
pts[:,0] -= cx
pts[:,1] -= cy

# Y cross-sections
print("=== Y (height) cross-sections ===")
for y_pos in range(-6, 7):
    mask = np.abs(pts[:,1] - y_pos) < 0.3
    xz = pts[mask]
    if len(xz) > 0:
        z0 = xz[:,2].min(); z1 = xz[:,2].max()
        x0 = xz[:,0].min(); x1 = xz[:,0].max()
        xs = np.unique(np.round(xz[:,0], 1))
        gaps = [(xs[i], xs[i+1]) for i in range(len(xs)-1) if xs[i+1]-xs[i] > 3]
        gp = " ".join("%.0f-%.0f" % g for g in gaps) if gaps else "-"
        # Check if Z varies
        z_unique = np.unique(np.round(xz[:,2], 1))
        z_var = len(z_unique) > 2
        print("Y=%+d: Z=[%.1f,%.1f] X=[%.1f,%.1f] gaps=%s Z_variation=%s" % (
            y_pos, z0, z1, x0, x1, gp, z_var))

# X cross-sections  
print("\n=== X (length) cross-sections ===")
for x_pos in range(-16, 18, 2):
    mask = np.abs(pts[:,0] - x_pos) < 0.3
    yz = pts[mask]
    if len(yz) > 0:
        z0 = yz[:,2].min(); z1 = yz[:,2].max()
        y0 = yz[:,1].min(); y1 = yz[:,1].max()
        z_unique = np.unique(np.round(yz[:,2], 1))
        z_var = len(z_unique) > 2
        print("X=%+3d: Z=[%.1f,%.1f] Y=[%.1f,%.1f] Z_levels=%d Zvar=%s" % (
            x_pos, z0, z1, y0, y1, len(z_unique), z_var))

# Check: at the outer edges (X near -16, +16) and at Y edges (-6, +6)
# Is the Z profile different?
print("\n=== Z profile at outer edges vs center ===")
for x_pos in [-15, 0, 15]:
    for y_pos in [-6, 0, 6]:
        mask = (np.abs(pts[:,0]-x_pos) < 0.5) & (np.abs(pts[:,1]-y_pos) < 0.5)
        zs = pts[mask, 2]
        if len(zs) > 0:
            print("X=%+3d Y=%+3d: Z=[%.1f..%.1f] (%.1f)" % (x_pos, y_pos, zs.min(), zs.max(), zs.max()-zs.min()))
        else:
            print("X=%+3d Y=%+3d: [empty - no material]" % (x_pos, y_pos))
