from PIL import Image,ImageDraw,ImageFont
import pathlib,json,numpy as np
p=pathlib.Path(__file__).parent
rows=[]
font=ImageFont.load_default(size=14)
for a in sorted(p.glob('before-*.png')):
 key=a.name[len('before-'):-4];b=p/('after-'+key+'.png')
 if not b.exists():continue
 x=np.array(Image.open(a).convert('RGB'));y=np.array(Image.open(b).convert('RGB'))
 assert x.shape==y.shape,(a,b)
 delta=np.abs(x.astype(int)-y.astype(int)).max(axis=2)
 for threshold,name in [(0,'diff0'),(8,'diff8')]:
  mask=delta>threshold
  out=np.zeros_like(x);out[mask]=[255,30,180]
  Image.fromarray(out).save(p/(name+'-'+key+'.png'))
 bbox=Image.fromarray((delta>0).astype('uint8')*255).getbbox()
 rows.append(dict(key=key,before=a.name,after=b.name,diff0='diff0-'+key+'.png',diff8='diff8-'+key+'.png',pixels0=int((delta>0).sum()),pixels8=int((delta>8).sum()),max_delta=int(delta.max()),bbox=bbox,size=[x.shape[1],x.shape[0]]))
(p/'diff-stats.json').write_text(json.dumps(rows,indent=2))
for group in sorted(set('-'.join(r['key'].split('-')[:3]) for r in rows)):
 rr=[r for r in rows if r['key'].startswith(group+'-')]
 width=440;gap=12
 cellh=max(round(width*r['size'][1]/r['size'][0]) for r in rr)+52
 sheet=Image.new('RGB',(width*4+gap*5,cellh*len(rr)+gap),(235,235,235));draw=ImageDraw.Draw(sheet)
 for j,r in enumerate(rr):
  for i,col in enumerate(['before','after','diff0','diff8']):
   im=Image.open(p/r[col]).convert('RGB');im.thumbnail((width,cellh-52))
   xx=gap+i*(width+gap);yy=gap+j*cellh
   draw.text((xx,yy),col+' '+r['key'],font=font,fill=(0,0,0))
   draw.text((xx,yy+18),('becf853def' if col=='before' else 'a2af027edb' if col=='after' else 'RGB > '+('0' if col=='diff0' else '8')+'/255'),font=font,fill=(0,0,0))
   sheet.paste(im,(xx,yy+40))
 sheet.save(p/('sheet-'+group+'.png'))
print('Pairs:',len(rows),'sheets:',len(list(p.glob('sheet-*.png'))))
for r in rows:print(r['key'],r['pixels0'],r['pixels8'],r['bbox'])
