#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""apply86.py — 把「参照央视1986版《西游记》经典造型」的风格锚点与逐角色造型要点
注入 prompts/*.json 的提示词里（可重复执行，幂等）。

锚点分三类：
  STYLE_CHAR  角色/妖怪：戏曲脸谱化妆容 + 传统戏曲盔甲戏服 + 影视道具质感
  STYLE_SCENE 场景：86 版实景取景 + 舞台化布景，水墨动画化
  STYLE_TEST  风格测试：主体为 86 版悟空造型
每张另加该角色的「造型要点」（照 86 版描述，避免模型自由发挥）。
"""
import json, os, re

ROOT = os.path.dirname(os.path.abspath(__file__))
os.chdir(ROOT)

A_CHAR = "造型严格参照央视1986年版电视剧《西游记》的经典影视形象：戏曲脸谱化妆容、传统戏曲盔甲与戏服、扎实的影视道具质感。"
A_SCENE = "美术参照央视1986年版电视剧《西游记》的实景取景与舞台化布景，以水墨动画风格呈现。"
A_TEST = "主体造型参照央视1986年版电视剧《西游记》的经典孙悟空形象：戏曲脸谱式猴王妆容、凤翅紫金冠、赤金锁子甲、虎皮短裙。"

HINTS = {
    "人物-01-孙悟空-大圣装": "造型要点：脸谱式猴王妆容（白色眼圈、红色脸颊纹、眉心朱点），凤翅紫金冠插两根雉鸡翎，赤金锁子甲下系虎皮短裙，手执如意金箍棒。",
    "人物-02-孙悟空-行者装": "造型要点：脸谱式猴王妆容（白色眼圈、红色脸颊纹），额戴金箍儿，虎皮短裙配僧衣，肩搭朱红披挂。",
    "人物-03-唐三藏": "造型要点：白净面庞、眉目慈悲，五佛冠毗卢帽，大红锦襕袈裟（田相格纹、金线勾边），手持九环锡杖，另一手托钵。",
    "人物-04-猪八戒": "造型要点：黑猪面具式面容，蒲扇大耳，獠牙微露，圆头圆腹；灰蓝敞襟僧衣露出肚腹，颈挂佛珠，肩扛九齿钉耙。",
    "人物-05-沙悟净": "造型要点：靛蓝脸膛，浓黑卷须络腮胡，圆睁双目；赭黄僧袍，颈挂九颗骷髅念珠，肩挑行李扁担，手握月牙铲（降妖宝杖）。",
    "人物-06-白龙马": "造型要点：神骏白马，银白鬃尾，深蓝织锦鞍鞯配红缨铜铃，马身隐约浮现淡青龙鳞与龙须虚影。",
    "人物-07-如来佛祖": "造型要点：金身螺发肉髻，眉心白毫，双耳垂肩，赭红袈裟，结跏趺坐千叶金莲，身后淡金背光。",
    "人物-08-观音菩萨": "造型要点：白衣观音，素白广袖长裙、披淡青披帛、璎珞垂胸，一手托白玉净瓶插翠绿杨柳枝，身后淡淡月轮。",
    "群像-师徒四人西行": "造型要点：师徒四人一马的造型均按 86 版经典形象做剪影式水墨处理，只有袈裟朱红与猴王赭金略施淡彩。",
    "妖怪-01-寅将军-虎精": "造型要点：斑斓虎头面具式面容，吊睛白额獠牙，戏曲武将皮甲配兽皮，手持一对虎头双刀。",
    "妖怪-02-熊山君-熊罴精": "造型要点：黑熊头面具，圆耳厚唇黑鬃，戏台武将铁甲配兽皮披风，双手握开山巨斧。",
    "妖怪-03-黄风怪-黄毛貂鼠": "造型要点：黄毛貂鼠面具式面目，尖嘴圆耳，黄色道袍外罩软甲，手持长枪，腰间悬黄皮风袋。",
    "妖怪-04-白骨夫人": "造型要点：惨白妖媚面容，幽绿眼窝，朱唇似血，素白破败长裙与薄纱，颈臂隐约白骨纹路，周身阴冷白雾。",
    "妖怪-05-金角大王": "造型要点：少年道童相貌，额生一只金色弯角，金发束髻，绣金道袍外罩金鳞软甲，手托紫金红葫芦。",
    "妖怪-06-银角大王": "造型要点：少年道童相貌，额生两只银色短角，银发披肩，素银道袍外罩银鳞软甲，手持七星剑，腰挂羊脂玉净瓶。",
    "妖怪-07-压龙大仙-九尾老狐": "造型要点：狐首人身的老妪，尖耳长吻白毛杂金，深紫金绣袍披狐裘，拄龙头拐杖，身后九条蓬松白狐尾如扇面。",
    "妖怪-08-灵感大王-金鱼精": "造型要点：红鳞金鱼妖，鱼首人形鼓眼长须，背鳍如旗，水蓝软甲配珍珠璎珞，手持铜锤，脚踏翻涌水浪。",
    "妖怪-09-黄袍怪-奎木狼": "造型要点：青灰狼首面具，黄瞳獠牙，土黄锦袍外罩星纹黑铁甲，腰挎弯刀，手持狼牙棒，肩后隐现星图。",
    "妖怪-10-玉面狐狸": "造型要点：玉白狐女面容，狐耳微露，眼尾上挑，粉白藕荷色宫装配披帛环佩，手持团扇，身后一条白狐尾。",
    "妖怪-11-红鳞大蟒": "造型要点：赤红蟒首人身，金瞳竖裂，信子分叉，赤红鳞甲覆体，手执蛇形长矛，蟒尾自身后拖出。",
    "妖怪-12-女儿国国王": "造型要点：端庄秀美，头戴珠翠凤冠，绛红与金色织锦宫装广袖垂地，披帛飘举，手执孔雀翎扇。",
    "妖怪-13-车迟国三道": "造型要点：虎力大仙（虎首人身黄黑虎纹）、鹿力大仙（鹿首人身褐毛长须）、羊力大仙（羊首人身白卷毛）三人并立，皆道冠道袍，分别持符剑、拂尘、法铃。",
    "妖怪-14-红孩儿": "造型要点：赤发红衣的孩童妖王，面白唇朱，颈戴金项圈、腕套金镯，大红绣金战袄配红绫，手持火尖枪，脚下赤红火云。",
    "妖怪-15-铁扇公主-罗刹女": "造型要点：英气女子，发髻高盘插翠钗，翠绿与赭红戏装劲服配软甲护肩，手持巨大翠色芭蕉扇。",
    "妖怪-16-牛魔王": "造型要点：牛头面具式面容，一对巨大弯角，鼻戴铜环，黑褐牛毛赤红双目，黑铁重甲配赭红战袍，手持混铁棍。",
    "妖怪-17-九头虫": "造型要点：鸟首人身水妖，九个长颈鸟头自肩后张开，青黑翠羽钩喙，碧绿水纹甲腰系玉带，手执三股钢叉。",
    "妖怪-18-黄狮精": "造型要点：金毛狮首人身，鬃毛蓬张如焰，赭黄皮甲配红缨披膊，一手扛偷来的九齿钉耙，一手握钢刀。",
    "妖怪-19-白毛老鼠精": "造型要点：白毛鼠首妖女，尖耳长吻双目精亮，素白与淡青薄纱长裙，腕戴银钏，手托一盏跳动的红烛。",
    "妖怪-20-蝎子精-琵琶精": "造型要点：艳丽妖女，眉眼含毒，鬓插赤金毒钩簪，紫红与墨黑紧身妖裙，肩后扬起赤褐蝎尾毒钩，怀中抱琵琶。",
    "妖怪-21-六耳猕猴": "造型要点：与悟空极似的猴王脸谱，但双耳格外细长、神情阴冷，行者装束与金箍儿，手持金箍棒。",
    "妖怪-22-赛太岁-金毛犼": "造型要点：金毛犼妖，狮首犼身人形，满头金毛蓬张，赤金鳞甲配兽皮，腰悬紫金铃，狂风卷黄沙。",
    "妖怪-23-玉兔精": "造型要点：清丽兔妖少女，雪白长发与一对长长兔耳，红瞳，月白与淡粉天竺式纱丽长裙配璎珞，手托红绣球，身后淡月桂影。",
    "妖怪-24-白鹿精-比丘国国丈": "造型要点：白鹿首人身的老道，鹿角高耸如枝，长须垂胸，素白道袍外罩青灰鹤氅，手持盘龙拐杖，身侧白鹿虚影。",
    "妖怪-25-百眼魔君-乌袍君": "造型要点：乌黑道袍的妖道，面容青灰双目赤红，额间竖生一目，两肋下张开千百只金色复眼金光如针，手持金光宝剑。",
    "妖怪-26-孤直公-柏树精": "造型要点：清癯高瘦老者，须发如柏叶苍翠，面色如树皮沟壑，墨绿赭褐宽袍，头戴枝叶冠冕，手持诗卷。",
    "妖怪-27-辟寒大王-犀牛精": "造型要点：青黑犀首人身，鼻端一只独角，皮糙如铁，青铜鳞甲配赭红战袍，手持半月钺斧，周身寒霜。",
}

SCENES = {
    "场景-01-花果山水帘洞": "",
    "场景-02-天宫瑶池": "",
    "场景-03-五行山": "",
    "场景-04-鹰愁涧": "",
    "场景-05-流沙河": "",
    "场景-06-黄风岭": "",
    "场景-07-白虎岭枯骨林": "",
    "场景-08-平顶山莲花洞": "",
    "场景-09-宝象国宫殿": "",
    "场景-10-七绝山稀柿衕": "",
    "场景-11-西梁女国宫苑": "",
    "场景-12-车迟国斗法台": "",
    "场景-13-火焰山": "",
    "场景-14-碧波潭水府": "",
    "场景-15-小雷音寺": "",
    "场景-16-木仙庵竹林": "",
    "场景-17-金平府金灯桥": "",
    "场景-18-凌云渡": "",
    "场景-19-灵山雷音寺": "",
}

ANCHORS = ["造型严格参照", "美术参照央视1986", "主体造型参照央视1986"]


def inject(items, anchor, hints):
    n = 0
    for it in items:
        p = it["prompt"]
        if any(a in p for a in ANCHORS):      # 已注入则先剥掉旧锚点与旧造型要点，保证幂等
            p = re.sub(r"造型严格参照央视1986年版电视剧《西游记》的经典影视形象：[^。]*。", "", p)
            p = re.sub(r"主体造型参照央视1986年版电视剧《西游记》的经典孙悟空形象：[^。]*。", "", p)
            p = re.sub(r"美术参照央视1986年版电视剧《西游记》的实景取景与舞台化布景，以水墨动画风格呈现。", "", p)
        p = re.sub(r"(造型要点：[^。]*。)+", "", p)
        hint = hints.get(it["name"], "")
        it["prompt"] = anchor + hint + p
        n += 1
    return n


for mf, anchor, hints in [
    ("prompts/01-风格测试.json", A_TEST, {}),
    ("prompts/02-人物设定.json", A_CHAR, HINTS),
    ("prompts/03-妖怪设定.json", A_CHAR, HINTS),
    ("prompts/04-场景设定.json", A_SCENE, SCENES),
]:
    items = json.load(open(mf, encoding="utf-8"))
    n = inject(items, anchor, hints)
    json.dump(items, open(mf, "w", encoding="utf-8"), ensure_ascii=False, indent=2)
    print(f"{mf}: 注入 {n} 条 (平均 {sum(len(i['prompt']) for i in items)//len(items)} 字)")
