"""Al doilea instrument: textul oficial al statului, 1848–2003.

Corpusul literar se oprește în 1949, fiindcă după acel an drepturile de autor
închid Wikisource. Legile fundamentale nu au problema asta: sunt publice, sunt
datate la zi și se pot citi în serie. Fiecare regim a rescris statul în
vocabularul lui, iar seria arată schimbul de straturi în singurul registru care
traversează cele două secole fără întrerupere.

Textul se cere prin action=parse, ca să vină și articolele transcluse.

Ieșire: raw/official.json
"""
import json, os, re, sys, time, urllib.parse, urllib.request

HERE = os.path.dirname(os.path.abspath(__file__))
RAW = os.path.join(HERE, "..", "raw")
sys.path.insert(0, HERE)
from lemma import Lemmatizer, tokenize

UA = "straturi-unui-cuvant/1.0 (https://straturi.mariuscomper.uk/)"

DOCS = [
    (1848, "Proclamația de la Islaz", "Proclamația de la Islaz"),
    (1858, "Convenția de la Paris", "Convențiunea de la Paris"),
    (1866, "Constituția României", "Constituția României (1866)"),
    (1923, "Constituția României", "Constituția României (1923)"),
    (1938, "Constituția României", "Constituția României (1938)"),
    (1948, "Constituția Republicii Populare Române", "Constituția României (1948)"),
    (1952, "Constituția Republicii Populare Române", "Constituția României (1952)"),
    (1965, "Constituția Republicii Socialiste România", "Constituția României (1965)"),
    (1991, "Constituția României", "Constituția României (1991)"),
    (2003, "Constituția României, revizuită", "Constituția României (2003)"),
]

HTML_DROP = re.compile(
    r"<(script|style|table|sup|span class=\"mw-editsection\").*?</\1>", re.S | re.I)


def plain_text(html):
    s = HTML_DROP.sub(" ", html)
    s = re.sub(r"<h[1-6][^>]*>.*?</h[1-6]>", " ", s, flags=re.S | re.I)
    s = re.sub(r"<[^>]+>", " ", s)
    s = (s.replace("&nbsp;", " ").replace("&amp;", "&").replace("&lt;", "<")
          .replace("&gt;", ">").replace("&quot;", '"').replace("&#160;", " ")
          .replace("&#39;", "'"))
    return re.sub(r"\s+", " ", s).strip()


def fetch(title):
    url = "https://ro.wikisource.org/w/api.php?" + urllib.parse.urlencode({
        "action": "parse", "page": title, "prop": "text",
        "format": "json", "formatversion": "2", "redirects": "1",
    })
    for a in range(5):
        try:
            req = urllib.request.Request(url, headers={"User-Agent": UA})
            with urllib.request.urlopen(req, timeout=120) as r:
                d = json.load(r)
            if "error" in d:
                return None
            return plain_text(d["parse"]["text"])
        except Exception as exc:  # noqa: BLE001
            if a == 4:
                print(f"  ! {title}: {exc}", file=sys.stderr)
                return None
            time.sleep(3 * (a + 1))
    return None


def main():
    L = Lemmatizer()
    out = []
    for year, label, page in DOCS:
        txt = fetch(page)
        time.sleep(0.3)
        if not txt:
            print(f"  {year} {page}: LIPSEȘTE")
            continue
        toks = tokenize(txt)
        if len(toks) < 1500:
            print(f"  {year} {page}: prea scurt ({len(toks)} cuvinte) — sărit")
            continue
        lem, unk = L.resolve(toks and __import__("collections").Counter(toks))
        out.append({
            "year": year, "label": label, "page": page,
            "chars": len(txt), "tokens": len(toks),
            "unmatched_tokens": unk,
            "lemma_tokens": round(sum(lem.values())),
            "lemmas": {k: round(v, 2) for k, v in lem.items() if v >= 1},
        })
        print(f"  {year}  {len(toks):>7,} cuvinte  nepotrivite "
              f"{unk/len(toks)*100:.1f}%  {page}")
    with open(os.path.join(RAW, "official.json"), "w", encoding="utf8") as f:
        json.dump(out, f, ensure_ascii=False)
    print(f"\n{len(out)} documente; scris raw/official.json")


if __name__ == "__main__":
    main()
