import json
import sys
from pathlib import Path

import numpy as np
from PIL import Image

folder = Path(sys.argv[1] if len(sys.argv) > 1 else ".")
checks = []
for left_name, right_name, output_name, swapped in [
    ("anaglyph-left.png", "anaglyph-right.png", "anaglyph-red-cyan.png", False),
    ("anaglyph-left.png", "anaglyph-right.png", "anaglyph-swapped.png", True),
    ("anaglyph-alpha-left.png", "anaglyph-alpha-right.png", "anaglyph-alpha-output.png", False),
]:
    a = np.asarray(Image.open(folder / left_name).convert("RGBA"), dtype=np.float64)
    b = np.asarray(Image.open(folder / right_name).convert("RGBA"), dtype=np.float64)
    actual = np.asarray(Image.open(folder / output_name).convert("RGBA"))
    a = np.floor((a[:, :, :3] * a[:, :, 3:] + 255 * (255 - a[:, :, 3:])) / 255 + 0.5)
    b = np.floor((b[:, :, :3] * b[:, :, 3:] + 255 * (255 - b[:, :, 3:])) / 255 + 0.5)
    expected = np.full(actual.shape, 255, dtype=np.uint8)
    expected[:, :, 0] = (b if swapped else a)[:, :, 0]
    expected[:, :, 1:3] = (a if swapped else b)[:, :, 1:3]
    assert np.array_equal(actual, expected), output_name
    checks.append(
        {
            "file": output_name,
            "pixels": int(actual.shape[0] * actual.shape[1]),
            "allChannelsEqual": True,
        }
    )
    if "alpha" not in output_name:
        record = json.loads((folder / output_name.replace(".png", ".json")).read_text())
        assert record["channelSums"] == actual[:, :, :3].sum(axis=(0, 1)).tolist()
camera = json.loads((folder / "anaglyph-camera-study.json").read_text())
for point in camera["landmarks"]:
    independent = (
        camera["width"]
        * camera["lensMM"]
        / camera["sensorWidthMM"]
        * camera["baselineMeters"]
        * (1 / point["depthMeters"] - 1 / camera["zeroParallaxMeters"])
    )
    assert abs(independent - point["disparityPixels"]) < 0.0001
proof = {
    "scope": "Independent saved PNG channel checks and projected origin arithmetic not stereo perception validation",
    "checks": checks,
    "cameraOrigins": len(camera["landmarks"]),
}
(folder / "anaglyph-pixel-validation.json").write_text(json.dumps(proof, indent=2) + "\n")
print(json.dumps(proof))
