import collections
import json
import sys
import unicodedata

import jiwer
from whisper_normalizer.english import EnglishTextNormalizer

english = EnglishTextNormalizer()


def basic(text):
    text = unicodedata.normalize("NFKC", text).casefold()
    out = []
    for ch in text:
        cat = unicodedata.category(ch)
        out.append(" " if cat.startswith("P") or cat.startswith("S") else ch)
    return " ".join("".join(out).split())


def main(path):
    data = json.load(open(path, encoding="utf-8"))
    groups = collections.defaultdict(lambda: ([], []))
    for clip in data["clips"]:
        norm = english if clip["language"] == "en" else basic
        ref = norm(clip["reference"])
        if not ref.strip():
            continue
        refs, hyps = groups[(clip["set"], clip["tier"])]
        refs.append(ref)
        hyps.append(norm(clip["transcript"] or ""))
    for (name, tier), (refs, hyps) in sorted(groups.items()):
        wer = jiwer.wer(refs, hyps) * 100
        print(f"{name:26s} {tier:9s} clips={len(refs):4d} wer={wer:.2f}%")


if __name__ == "__main__":
    main(sys.argv[1] if len(sys.argv) > 1 else "per-clip-results.json")
