#!/usr/bin/env python3
"""Compare complete unmodified captures, emit exact binary and threshold overlays."""
import json, pathlib
from PIL import Image, ImageChops, ImageDraw, ImageFont
root=pathlib.Path(__file__).resolve().parent
font=ImageFont.load_default(size=16)
pairs=[]
for before in sorted(root.glob('before-*-*-*-*.png')):
    key=before.name.removeprefix('before-').removesuffix('.png')
    after=root/('after-'+key+'.png')
    if not after.exists(): raise RuntimeError('Unpaired '+str(before))
    a,b=Image.open(before).convert('RGB'),Image.open(after).convert('RGB')
    assert a.size==b.size
    delta=ImageChops.difference(a,b)
    r,g,bl=delta.split()
    maximum=ImageChops.lighter(ImageChops.lighter(r,g),bl)
    mask0=maximum.point(lambda v:255 if v>0 else 0)
    maskt=maximum.point(lambda v:255 if v>16 else 0)
    diff0=Image.new('RGB',a.size,'black')
    diff0.paste((255,0,180),(0,0),mask0)
    dim=Image.blend(Image.new('RGB',b.size,'white'),b.convert('L').convert('RGB'),0.4)
    dim.paste((255,0,0),(0,0),maskt)
    d0=root/('diff0-'+key+'.png');dt=root/('diffT16-'+key+'.png')
    diff0.save(d0);dim.save(dt)
    count0=sum(v>0 for v in maximum.getdata());countt=sum(v>16 for v in maximum.getdata())
    # Full source images, no crops; labels are outside the screenshots.
    sheet=Image.new('RGB',(a.width*2,a.height*2+80),'#ededed')
    draw=ImageDraw.Draw(sheet)
    for im,label,x,y in [(a,'Before 28286d523f',0,0),(b,'After f651bd79c4',a.width,0),(diff0,'Diff0: >0/255, binary x255',0,a.height+40),(dim,'DiffT: >16/255 per channel',a.width,a.height+40)]:
        draw.text((x+10,y+9),key+' | '+label,fill='black',font=font)
        sheet.paste(im,(x,y+40))
    sheetpath=root/('sheet-'+key+'.png');sheet.save(sheetpath)
    pairs.append({'key':key,'before':str(before),'after':str(after),'diff0':str(d0),'diffT':str(dt),'sheet':str(sheetpath),'changedPixels0':count0,'changedPixels16':countt,'fraction0':count0/(a.width*a.height),'bbox0':delta.getbbox(),'pixels':list(a.size)})
(root/'diff-results.json').write_text(json.dumps(pairs,indent=2)+'\n')
print(json.dumps([{k:p[k] for k in ['key','changedPixels0','changedPixels16','fraction0','bbox0']} for p in pairs],indent=2))
