#!/usr/bin/env python3
from pathlib import Path
from PIL import Image
import json,hashlib,datetime
P='gacmai_20260717_104203';R=Path('/data/video-pipeline/GacMaiAudio/project')/P;A=R/'artifacts';C=R/'assets/images/candidates';O=R/'assets/images';O.mkdir(parents=True,exist_ok=True)
accepted={'intro':('intro_v3.png','2495286d30efe75662e20a9e3b829fe631e04e8cb2f4b1cd97f7b4577b2fa0ab'),'left':('left_v2.png','334986a27535a4a6faca35f5f279eeb8daae5789884286e0e55f17763360e144'),'right':('right_v2.png','2e7f783668def8364d7765e000ff37daeb73508c6a1db1c149902b9745c72546')}
def sha(p):return hashlib.sha256(p.read_bytes()).hexdigest()
for k,(n,h) in accepted.items():
 p=C/n
 if sha(p)!=h:raise SystemExit(f'{k} checksum mismatch')
def cover(src,size):
 im=Image.open(src).convert('RGB');sw,sh=im.size;tw,th=size;scale=max(tw/sw,th/sh);nw,nh=round(sw*scale),round(sh*scale);im=im.resize((nw,nh),Image.Resampling.LANCZOS);x=(nw-tw)//2;y=(nh-th)//2;return im.crop((x,y,x+tw,y+th))
intro=cover(C/accepted['intro'][0],(1920,1080));left=cover(C/accepted['left'][0],(600,1080));right=cover(C/accepted['right'][0],(600,1080));layout=Image.new('RGB',(1920,1080),(0,255,0));layout.paste(left,(0,0));layout.paste(right,(1320,0));
paths={'intro':O/'intro_1920x1080.png','left':O/'left_600x1080.png','right':O/'right_600x1080.png','layout':O/'three_panel_layout.png'};intro.save(paths['intro']);left.save(paths['left']);right.save(paths['right']);layout.save(paths['layout'])
pix=layout.load();green_center=sum(pix[x,y]==(0,255,0) for x in range(600,1320) for y in range(1080));green_out=sum(pix[x,y]==(0,255,0) for x in list(range(600))+list(range(1320,1920)) for y in range(1080));status='passed' if green_center==777600 and green_out==0 else 'failed';receipt={'status':status,'story_sha256':json.loads((R/'status.json').read_text())['story_sha256'],'accepted_originals':{k:{'path':str(C/n),'sha256':h} for k,(n,h) in accepted.items()},'operations':['scale','center_crop','place'],'post_added_typography':False,'geometry':{'canvas':[1920,1080],'left_width':600,'center_width':720,'right_width':600,'center_rgb':[0,255,0],'center_green_pixels':green_center,'green_pixels_outside_center':green_out},'outputs':{k:{'path':str(v),'sha256':sha(v)} for k,v in paths.items()},'created_at':datetime.datetime.now(datetime.timezone.utc).isoformat()};(A/'visual_acceptance_geometry_receipt.json').write_text(json.dumps(receipt,indent=2)+'\n');print(json.dumps(receipt));raise SystemExit(1 if status!='passed' else 0)
