#!/usr/bin/env bash
# Cross-backend parity check: renders each milestone example with the vello
# (GPU) and tiny-skia (software) backends under quibble, screenshots both at
# two output sizes, and compares each pair with the cross-renderer tolerance.
#
# Requires: quibble + quibblectl on PATH. Exits nonzero on any mismatch.
set -euo pipefail
cd "$(dirname "$0")/.."

EXAMPLES=(m0_scene m1_widgets m2_counter m3_counter m4_themed m5_dev m6_form m8_echo m9_scroll m10_panel m16_demo m18_demo)

for example in "${EXAMPLES[@]}"; do
    cargo build -p guiduck --example "$example"
done
cargo build -p guiduck-render-tinyskia --bin png-diff

workdir=$(mktemp -d)
declare -a socks=()
cleanup() {
    for sock in "${socks[@]}"; do
        quibblectl --socket "$sock" quit >/dev/null 2>&1 || true
    done
    if [ -n "${PARITY_KEEP:-}" ]; then echo "images kept in $workdir" >&2; else rm -rf "$workdir"; fi
}
trap cleanup EXIT

status=0
for example in "${EXAMPLES[@]}"; do
    for backend in vello software; do
        sock="$workdir/$example-$backend.sock"
        socks+=("$sock")
        GUIDUCK_BACKEND=$backend quibble --socket "$sock" \
            "target/debug/examples/$example" \
            >"$workdir/$example-$backend.out" 2>"$workdir/$example-$backend.err" &
        for _ in $(seq 1 50); do
            quibblectl --socket "$sock" ping >/dev/null 2>&1 && break
            sleep 0.2
        done
        quibblectl --socket "$sock" wait-window --timeout-ms 30000 >/dev/null
    done

    for size in "1280 800" "700 500"; do
        read -r w h <<<"$size"
        for backend in vello software; do
            quibblectl --socket "$workdir/$example-$backend.sock" \
                set-output "$w" "$h" >/dev/null
        done
        # Give both apps a moment to repaint at the new size.
        sleep 1
        for backend in vello software; do
            quibblectl --socket "$workdir/$example-$backend.sock" \
                screenshot -o "$workdir/$example-$backend-${w}x${h}.png" >/dev/null
        done
        echo "== $example ${w}x${h} =="
        if ! target/debug/png-diff \
            "$workdir/$example-vello-${w}x${h}.png" \
            "$workdir/$example-software-${w}x${h}.png"; then
            status=1
            keep="target/parity-failures"
            mkdir -p "$keep"
            cp "$workdir/$example-vello-${w}x${h}.png" \
                "$workdir/$example-software-${w}x${h}.png" "$keep/"
            echo "MISMATCH: $example at ${w}x${h}; screenshots kept in $keep/" >&2
        fi
    done

    for backend in vello software; do
        quibblectl --socket "$workdir/$example-$backend.sock" quit >/dev/null 2>&1 || true
    done
done

exit $status
