"""Updates toonPoses.json from a JSON patch: python3 poses.py '{"butler": {"rest": {"head": {"w": 0.93}}}}' merges per bone."""
import json, sys
p = "src/web/src/domain/toonPoses.json"
d = json.load(open(p))
for voice, change in json.loads(sys.argv[1]).items():
    target = d[voice] if not change.get("stance") else d[voice]["stances"][change.pop("stance")]
    for bone, turn in change.get("rest", {}).items():
        if turn is None: target["rest"].pop(bone, None)
        else: target["rest"][bone] = turn
    if "seat" in change: target["seat"] = change["seat"]
    if "sits" in change: target["sits"] = change["sits"]
    if "grip" in change: target["grip"] = change["grip"]
def rest(r, pad):
    return "{\n" + ",\n".join(f'{pad}    "{k}": {json.dumps(v)}' for k, v in r.items()) + f"\n{pad}}}"
out = []
for voice, v in d.items():
    body = f'        "rest": {rest(v["rest"], "        ")},\n        "seat": {json.dumps(v["seat"])},\n        "sits": {json.dumps(v["sits"])}' + (f',\n        "grip": {json.dumps(v["grip"])}' if "grip" in v else '') + ''
    if "stances" in v:
        st = ",\n".join(f'            "{n}": {{\n                "rest": {rest(s["rest"], "                ")},\n                "seat": {json.dumps(s["seat"])},\n                "sits": {json.dumps(s["sits"])}\n            }}' for n, s in v["stances"].items())
        body += f',\n        "stances": {{\n{st}\n        }}'
    out.append(f'    "{voice}": {{\n{body}\n    }}')
text = "{\n" + ",\n".join(out) + "\n}\n"
assert json.loads(text) == d
open(p, "w").write(text)
