# -*- coding: utf-8 -*-
"""原创离线合成样例；不连接模型、不读取账户。输出位于脚本旁。
已有输入保留，修改输入后可以重跑。失败边界由 --negative 单独演示。
"""
from pathlib import Path
import sys, json, csv, math, io, hashlib, html, base64, re
sys.stdout.reconfigure(encoding='utf-8')
sys.stderr.reconfigure(encoding='utf-8')
BASE = Path(__file__).resolve().parent
NEG = '--negative' in sys.argv
def write(name, value):
    p=BASE/name; p.parent.mkdir(parents=True,exist_ok=True)
    if isinstance(value,bytes): p.write_bytes(value)
    else: p.write_text(value,encoding='utf-8',newline='')
def seed(name,value):
    if not (BASE/name).exists(): write(name,value)
def jwrite(name,value): write(name,json.dumps(value,ensure_ascii=False,indent=2))
def jseed(name,value):
    if not (BASE/name).exists(): jwrite(name,value)
def load(name): return json.loads((BASE/name).read_text(encoding='utf-8'))
def table(name,heads,rows):
    f=io.StringIO(newline='');w=csv.writer(f);w.writerow(heads);w.writerows(rows);write(name,f.getvalue())
def page(name,title,body):
    write(name,'<!doctype html><html lang="zh-CN"><meta charset="utf-8"><meta name="viewport" content="width=device-width,initial-scale=1"><title>'+html.escape(title)+'</title><style>body{max-width:1000px;margin:2rem auto;padding:0 1rem;font:17px/1.7 system-ui}table{border-collapse:collapse}td,th{border:1px solid #aaa;padding:.5rem}pre{white-space:pre-wrap;overflow-wrap:anywhere}img,svg{max-width:100%;height:auto}a{color:#125caa}</style><h1>'+html.escape(title)+'</h1>'+body+'</html>')
def emit(data): print(json.dumps(data,ensure_ascii=False))

from PIL import Image,ImageDraw
for i,box in enumerate([(4,4,28,28),(24,12,56,52),(8,28,55,39),(18,18,45,45)],1):
    p=BASE/f'source-{i}.png'
    if not p.exists():
        im=Image.new('RGBA',(64,64));draw=ImageDraw.Draw(im)
        if i==4:draw.ellipse(box,fill=(30,110,180,255))
        else:draw.rectangle(box,fill=(30,110,180,255))
        im.save(p)
if NEG:Image.new('RGBA',(64,64)).save(BASE/'empty.png');names=['empty.png']
else:names=['source-1.png','source-2.png','source-3.png','source-4.png']
out=[];sheet=Image.new('RGBA',(512,168),'#eeeeee');label=ImageDraw.Draw(sheet);label.text((3,3),'BEFORE: original canvas / AFTER: content longest side 48',fill='black')
for i,name in enumerate(names):
    im=Image.open(BASE/name).convert('RGBA');mask=im.getchannel('A').point(lambda a:255 if a>=16 else 0);box=mask.getbbox()
    if not box:raise ValueError('全透明图片无可见内容')
    crop=im.crop(box);scale=48/max(crop.size);crop=crop.resize((round(crop.width*scale),round(crop.height*scale)),Image.Resampling.LANCZOS);canvas=Image.new('RGBA',(64,64));canvas.alpha_composite(crop,((64-crop.width)//2,(64-crop.height)//2));canvas.save(BASE/f'aligned-{i+1}.png');sheet.alpha_composite(im,(i*128+50,20));sheet.alpha_composite(canvas,(i*128+50,100));label.text((i*128+2,45),'before '+str(i+1),fill='black');label.text((i*128+2,125),'after '+str(i+1),fill='black');out.append([name,list(box),crop.size])
sheet.convert('RGB').save(BASE/'contact-sheet.png');jwrite('bounds.json',out);emit({'bounds':out})
