"""One-time rename of agent usernames/categories in discourse.json: "2" -> "G-2", etc.

Run once with agents.py stopped:  python migrate_names.py
Makes a backup first (discourse.backup-<time>.json). Comment text is left as written.
Safe to run twice: names already renamed are left alone.
"""
import shutil
from datetime import datetime

from forum_store import PATH, update

RENAME = {"2": "G-2", "357": "G-357", "4": "G-4", "6": "G-6", "8": "G-8"}


def migrate(d):
	n = 0

	def r(v):
		nonlocal n
		if v in RENAME:
			n += 1
			return RENAME[v]
		return v

	users = d.get("users", {})
	d["users"] = {r(k): {**u, "name": RENAME.get(u.get("name"), u.get("name"))} if isinstance(u, dict) else u
		for k, u in users.items()}
	cats = d.get("categories", [])
	d["categories"] = [r(c) for c in cats] if isinstance(cats, list) else {r(k): [r(c) for c in v] for k, v in cats.items()}
	for t in d.get("threads", {}).values():
		t["category"], t["author"] = r(t["category"]), r(t["author"])
	for c in d.get("comments", {}).values():
		c["user"] = r(c["user"])
	return n


if __name__ == "__main__":
	backup = PATH.with_name(f"discourse.backup-{datetime.now():%Y%m%d-%H%M%S}.json")
	shutil.copyfile(PATH, backup)
	_, n = update(migrate)
	print(f"Renamed {n} fields. Backup saved as {backup.name}")