#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""为《凡骨问长生》角色生成设定图（Agnes API · 16:9 · 2K · 免费）
用法:
  python3 gen_sheets.py                     # 全部 24 位（断点续跑，已存在跳过）
  python3 gen_sheets.py 沈砚 云芷柔          # 只出指定角色
  python3 gen_sheets.py --force 沈砚        # 强制重出
"""
import argparse
import json
import os
import re
import sys
import urllib.request

sys.path.insert(0, "/Users/cheyod/AIGC/DSH/manju")
import ag_api  # noqa: E402

OUT = os.path.dirname(os.path.abspath(__file__))
IMG_DIR = os.path.join(OUT, "images")
os.makedirs(IMG_DIR, exist_ok=True)


def slug(name):
    return re.sub(r"[（(].*?[)）]", "", name).strip()


def gen(name, sheet, force=False):
    out = os.path.join(IMG_DIR, f"{slug(name)}-sheet.png")
    if os.path.exists(out) and not force:
        print(f"  [skip] {name} 已存在", flush=True)
        return out
    print(f"  ▶ {name}: 生成中...", flush=True)
    url = ag_api.image_generate(sheet, size="2K", ratio="16:9", timeout=360)
    req = urllib.request.Request(url, headers={"User-Agent": "Mozilla/5.0"})
    with urllib.request.urlopen(req, timeout=180) as r:
        data = r.read()
    with open(out, "wb") as f:
        f.write(data)
    print(f"  ✅ {name} -> {out} ({len(data)//1024}KB)", flush=True)
    return out


if __name__ == "__main__":
    ap = argparse.ArgumentParser()
    ap.add_argument("names", nargs="*", help="角色名（不传则全部 24 位）")
    ap.add_argument("--force", action="store_true")
    args = ap.parse_args()

    manifest = json.load(open(os.path.join(OUT, "人物出图清单.json"), encoding="utf-8"))
    targets = [m for m in manifest if not args.names or m["name"] in args.names]
    if not targets:
        print("没有匹配的角色名，退出")
        sys.exit(1)
    ok, fail = 0, 0
    for m in targets:
        try:
            gen(m["name"], m["sheetPrompt"], args.force)
            ok += 1
        except Exception as e:
            print(f"  ❌ {m['name']} 失败: {e}", flush=True)
            fail += 1
    print(f"批量完成：成功 {ok}，失败 {fail}")
