import json
import sys
from pathlib import Path

import numpy as np
from PIL import Image

folder = Path(sys.argv[1])
record = json.loads((folder / "forced-perspective-camera-record.json").read_text())
checks = []
for camera in ["locked", "reveal"]:
    pixels = np.asarray(Image.open(folder / f"forced-perspective-{camera}-id.png").convert("RGBA"))
    for name, channel in [("Near sphere", 0), ("Far sphere", 1)]:
        other = 1 - channel
        mask = (pixels[:, :, channel] > 128) & (pixels[:, :, other] < 20) & (pixels[:, :, 2] < 20)
        y, x = np.where(mask)
        assert len(x) > 100
        bounds = {
            "minX": int(x.min()),
            "maxX": int(x.max() + 1),
            "minY": int(y.min()),
            "maxY": int(y.max() + 1),
        }
        expected = next(
            p
            for p in record["projectedVertexBounds"]
            if p["camera"] == camera and p["object"] == name
        )
        for k, v in bounds.items():
            assert abs(v - expected[k]) < 2, (camera, name, k, v, expected[k])
        assert (
            bounds["minX"] > 0
            and bounds["maxX"] < 800
            and bounds["minY"] > 0
            and bounds["maxY"] < 500
        )
        checks.append(
            {
                "camera": camera,
                "object": name,
                "pixels": int(len(x)),
                "bounds": bounds,
                "height": bounds["maxY"] - bounds["minY"],
            }
        )
assert abs(checks[0]["height"] - checks[1]["height"]) <= 1
assert checks[3]["height"] > 2 * checks[2]["height"]
plan = json.loads((folder / "forced-perspective-plan.json").read_text())
assert abs(plan["farDistance"] - 12) < 1e-12
assert abs(plan["nearProjectedHeightPixels"] - plan["farProjectedHeightPixels"]) < 1e-12
proof = {
    "scope": "Native ID mask bounds checked against Blender projected vertices plus independent planar height math Not a measured photograph or AI generation test",
    "checks": checks,
    "frontPixelHeightsMatchedWithinOnePixel": True,
    "revealFarHeightExceedsTwiceNear": True,
}
(folder / "forced-perspective-pixel-validation.json").write_text(json.dumps(proof, indent=2) + "\n")
print(json.dumps(proof))
