"""Verificarea cuvintelor care cântăresc.

Procentele pe straturi se decid într-o mână de cuvinte: primele două sute de leme
țin aproape jumătate din textul curgător, așa că o singură atribuire greșită
mișcă un strat întreg. Instrumentul le scoate la vedere pe cele riscante — unde
Wiktionary și dexonline nu spun același lucru, sau unde pagina are mai multe
secțiuni de etimologie, semn că lema acoperă doi omonimi cu istorii diferite.

Corecțiile verificate se scriu de mână în tools/overrides.json și intră în
analiză peste atribuirea automată.
"""
import gzip, json, os, re, sys
from collections import defaultdict

HERE = os.path.dirname(os.path.abspath(__file__))
RAW = os.path.join(HERE, "..", "raw")
sys.path.insert(0, HERE)
from strata import PRIORITY, proximate_layers

TOP = int(os.environ.get("TOP", 250))


def main():
    cats = json.load(open(os.path.join(RAW, "categories.json"), encoding="utf8"))
    lay = proximate_layers(cats)
    now = json.load(open(os.path.join(RAW, "now_counts.json"), encoding="utf8"))
    hist = json.load(open(os.path.join(RAW, "hist_bins.json"), encoding="utf8"))
    dex = json.load(open(os.path.join(RAW, "dex_ety.json"), encoding="utf8"))
    sections = json.load(gzip.open(os.path.join(RAW, "wikt_sections.json.gz"),
                                   "rt", encoding="utf8"))

    weight = defaultdict(float)
    for reg in ("vorbit", "scris"):
        t = now[reg]["lemma_tokens"]
        for w, n in now[reg]["lemmas"].items():
            weight[w] += n / t
    ht = sum(b["lemma_tokens"] for b in hist["bins"].values())
    for b in hist["bins"].values():
        for w, n in b["lemmas"].items():
            weight[w] += n / ht

    ranked = sorted((w for w in weight if w in lay), key=lambda w: -weight[w])[:TOP]
    overrides_path = os.path.join(HERE, "overrides.json")
    ov = json.load(open(overrides_path, encoding="utf8")) if os.path.exists(overrides_path) else {}

    n_multi = n_dis = 0
    rows = []
    for w in ranked:
        sec = sections.get(w, "")
        multi = len(re.findall(r"===+\s*Etymology\s*\d+\s*===+", sec))
        d = dex.get(w)
        flag = []
        if multi >= 2:
            flag.append(f"{multi} etimologii")
            n_multi += 1
        if d and d != lay[w]:
            flag.append(f"dexonline: {d}")
            n_dis += 1
        rows.append((w, lay[w], ", ".join(flag), w in ov))

    print(f"primele {TOP} leme după greutate în text")
    print(f"  cu mai multe etimologii pe pagină: {n_multi}")
    print(f"  în dezacord cu dexonline: {n_dis}")
    print(f"  deja corectate manual: {sum(1 for r in rows if r[3])}\n")
    print(f"{'cuvânt':<16}{'strat':<17}{'semnale'}")
    for w, st, flag, done in rows:
        if flag or done:
            print(f"{w:<16}{st:<17}{flag}{'   [corectat]' if done else ''}")


if __name__ == "__main__":
    main()
