#!/usr/bin/env python3
from pathlib import Path
from PIL import Image
import hashlib,json
ROOT=Path('/data/video-pipeline/GacMaiAudio/project/gacmai_20260716_233054')
A=ROOT/'assets/images/accepted';OUT=ROOT/'assets/images';OUT.mkdir(parents=True,exist_ok=True)
required={'intro':A/'intro.png','left':A/'left.png','right':A/'right.png'}
for name,p in required.items():
 if not p.exists():raise SystemExit(f'missing accepted provider original: {name}')
def fit(p,w,h):
 im=Image.open(p).convert('RGB');im.thumbnail((w,h),Image.Resampling.LANCZOS);canvas=Image.new('RGB',(w,h),(4,18,21));canvas.paste(im,((w-im.width)//2,(h-im.height)//2));return canvas
left=fit(required['left'],600,1080);right=fit(required['right'],600,1080);center=Image.new('RGB',(720,1080),(0,255,0));layout=Image.new('RGB',(1920,1080));layout.paste(left,(0,0));layout.paste(center,(600,0));layout.paste(right,(1320,0));layout_path=OUT/'three_panel_layout.png';layout.save(layout_path)
intro=Image.open(required['intro']).convert('RGB').resize((1920,1080),Image.Resampling.LANCZOS);intro_path=OUT/'intro_1920x1080.png';intro.save(intro_path)
pix=layout.load();center_green=sum(1 for y in range(1080) for x in range(600,1320) if pix[x,y]==(0,255,0));outside_green=sum(1 for y in range(1080) for x in list(range(0,600))+list(range(1320,1920)) if pix[x,y]==(0,255,0))
if center_green!=777600 or outside_green!=0:raise SystemExit(f'green invariant failed center={center_green} outside={outside_green}')
def sha(p):return hashlib.sha256(p.read_bytes()).hexdigest()
receipt={'status':'passed','project_id':ROOT.name,'geometry':'600/720/600','canvas':[1920,1080],'center':[600,0,720,1080],'center_green_pixels':center_green,'outside_green_pixels':outside_green,'operation':['scale','pad','place'],'post_added_typography':False,'sources':{k:{'path':str(v),'sha256':sha(v)} for k,v in required.items()},'layout':{'path':str(layout_path),'sha256':sha(layout_path)},'intro_scaled':{'path':str(intro_path),'sha256':sha(intro_path)}}
(ROOT/'artifacts/visual_geometry_receipt.json').write_text(json.dumps(receipt,indent=2)+'\n');print(json.dumps(receipt))
