# -*- 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
if not (BASE/'sheet.png').exists():
    im=Image.new('RGBA',(96,64));d=ImageDraw.Draw(im)
    for k,color in enumerate(['red','orange','green','blue','purple','brown']):
        x,y=(k%3)*32,(k//3)*32;d.rectangle((x+5,y+5,x+26,y+26),fill=color);d.text((x+12,y+10),str(k),fill='white')
    im.save(BASE/'sheet.png')
im=Image.open(BASE/'sheet.png');w,h=32,32
if NEG:w=31
if im.width%w or im.height%h:raise ValueError('图集尺寸不能被帧大小整除')
frames=[]
for k in range(im.width//w*(im.height//h)):
    x,y=(k%(im.width//w))*w,(k//(im.width//w))*h;file=f'frames/frame-{k:02}.png';(BASE/'frames').mkdir(exist_ok=True);im.crop((x,y,x+w,y+h)).save(BASE/file);frames.append({'file':file,'rect':[x,y,w,h],'duration_ms':100+k*20})
jwrite('atlas.json',{'order':'row-major','frame_size':[w,h],'states':{'idle':[0,1,2],'move':[3,4,5]},'frames':frames});page('preview.html','逐帧原图预览','<p>左到右、上到下编号。静态预览用于查裁切，动作流畅度需人工观看。</p>'+''.join(f'<figure><img src="{f["file"]}" width="96" height="96"><figcaption>frame {i}, {f["duration_ms"]}ms</figcaption></figure>' for i,f in enumerate(frames)));emit({'frames':len(frames),'last_rect':frames[-1]['rect']})
