#!/usr/bin/env python3
"""Export approved ImageGen PNG artwork; no API calls or credentials required."""
import argparse
import hashlib
import json
from pathlib import Path
from PIL import Image

parser=argparse.ArgumentParser(description=__doc__)
parser.add_argument('--master',type=Path,required=True)
parser.add_argument('--output',type=Path,required=True)
parser.add_argument('--motion',action='append',default=[],metavar='NAME=PNG')
parser.add_argument('--size',type=int,default=384)
parser.add_argument('--keep-canvas',action='store_true',help='Preserve full registered canvas rather than fitting the alpha bounds')
args=parser.parse_args()
args.output.mkdir(parents=True,exist_ok=True)
image=Image.open(args.master).convert('RGBA')
box=(0,0,*image.size) if args.keep_canvas else image.getchannel('A').point(lambda a:255 if a>80 else 0).getbbox()
if not box:raise SystemExit('Master is fully transparent')
cropped=image.crop(box)
scale=args.size*(1 if args.keep_canvas else .9)/max(cropped.size)
size=tuple(max(1,round(value*scale)) for value in cropped.size)
offset=((args.size-size[0])//2,(args.size-size[1])//2)
canvas=Image.new('RGBA',(args.size,args.size))
canvas.alpha_composite(cropped.resize(size,Image.Resampling.LANCZOS),offset)
canvas.save(args.output/'base.webp',quality=82,method=6)
files=['base.webp']
for value in args.motion:
 name,source=value.split('=',1)
 if not name.replace('-','').isalnum():raise SystemExit('Use a simple ASCII layer name')
 layer=Image.open(source).convert('RGBA');layer.thumbnail((220,260))
 filename=name+'.webp';layer.save(args.output/filename,quality=82,method=6);files.append(filename)
metadata={'canvas':[args.size,args.size],'source_sha256':hashlib.sha256(args.master.read_bytes()).hexdigest(),
          'source_crop':box,'scale':scale,'offset':offset,'files':files,
          'registration':'Recalculate layer anchors with this crop/scale/offset; verify physical pivots before use.'}
(args.output/'export.json').write_text(json.dumps(metadata,indent=2)+'\n')
print(json.dumps(metadata,indent=2))
