#!/usr/bin/env python3
"""Runs ON gex44 with the forge-repaint runtime. Before/after pictures of a painted craft with the painter's own renderer (flat,
unlit: it shows the texture itself, which is what the paint pass changes). Three views (3/4 front from above, side, 3/4 rear),
each 1000 px, before on top, after below.
usage: paint_compare_remote.py <before.glb> <after.glb> <out.jpg>"""
import sys
from pathlib import Path
import numpy as np
from PIL import Image, ImageDraw
sys.path.insert(0, '/opt/forge-repaint/core'); sys.path.insert(0, '/opt/forge-repaint/vendor')
import repaint as rp  # noqa: E402
import forge_pixel_match as fpm  # noqa: E402
from pm_lab import photo_paint as pp  # noqa: E402

PX, FOV = 1000, 0.6
VIEWS = [(35, 22), (90, 4), (215, 22)]


def shots(glb):
    P, U, F, T, _ = fpm.read_model(Path(glb))
    frame = rp.parse_frame('0,2,1/1,-1,1')
    pos = pp.to_view_space(P, frame, 1)
    out = []
    for a, l in VIEWS:
        v = rp.blank_view(rp.orbit_camera(pos, a, l, FOV, margin=.03), FOV, 'cmp', PX)
        mask, rgb = rp.render(P, U, F, T, v, frame, 1)
        im = np.full((PX, PX, 3), 214, np.uint8); im[mask] = rgb[mask][:, :3] if rgb.ndim == 3 and rgb.shape[2] > 3 else rgb[mask]
        out.append(Image.fromarray(im))
    return out


def main(before, after, dst):
    rows = [shots(before), shots(after)]
    sheet = Image.new('RGB', (PX * 3, PX * 2 + 60), (214, 214, 214)); d = ImageDraw.Draw(sheet)
    for r, row in enumerate(rows):
        for c, im in enumerate(row):
            sheet.paste(im, (c * PX, 30 + r * (PX + 30)))
    d.text((10, 8), 'BEFORE (Blender model, baked)', fill=(20, 20, 20)); d.text((10, PX + 38), 'AFTER (paint pass)', fill=(20, 20, 20))
    sheet.save(dst, quality=88)
    for k, (b, a) in enumerate(zip(*rows)):
        b.save(str(dst).replace('.jpg', f'-before{k}.jpg'), quality=88); a.save(str(dst).replace('.jpg', f'-after{k}.jpg'), quality=88)
    print(dst)


if __name__ == '__main__':
    main(*sys.argv[1:4])
