import json, sys

def norm(n):
    return n.replace(" ", "").replace("　", "").strip()

# outline roster (seed)
seed = json.load(open("小说2/characters-work/seed.json"))
outline = {norm(c["name"]): c for c in seed["characters"]}

# fresh scan merged roster
merged = json.load(open("小说2/characters-work/merged.json"))
scanned = {norm(c["name"]): c for c in merged["characters"]}

out_names = set(outline)
sc_names = set(scanned)
print("== outline characters:", len(out_names))
print("== scanned characters:", len(sc_names))

# scanned but not obviously in outline (by name or alias overlap)
def matches(o_name, s_name, s_aliases):
    return o_name == s_name or s_name in outline[o_name].get("aliases", []) or            any(a in outline[o_name].get("aliases", []) or a == o_name for a in s_aliases)

print("
-- scanned chars possibly NEW (not matched to outline) --")
for s_name, sc in scanned.items():
    found = any(matches(o, s_name, sc.get("aliases", [])) for o in out_names)
    if not found:
        print("  ?", sc["name"], "| aliases:", sc.get("aliases", []), "| quotes:", len(sc.get("quotes", [])))

print("
-- outline chars possibly MISSING from scan --")
for o_name, oc in outline.items():
    found = any(matches(o_name, s_name, scanned[s_name].get("aliases", [])) for s_name in scanned)
    if not found:
        print("  ?", oc["name"])
