"""Contrôle et recalcul du paquet lecteur, bibliothèque standard, lecture seule."""
from pathlib import Path
from collections import Counter
import hashlib
import json

root = Path(__file__).resolve().parent
def rows(name):
    return [json.loads(x) for x in (root/name).read_text().splitlines() if x.strip()]

agencies=rows('corpus.jsonl')
observations=rows('observations.jsonl')
sources=rows('sources.jsonl')
assert len(agencies)==len({a['agency_id'] for a in agencies})==30
assert len(observations)==len({(o['agency_id'],o['variable']) for o in observations})==120
assert len(sources)==len({s['source_id'] for s in sources})==90
am={a['agency_id']:a for a in agencies}
sm={s['source_id']:s for s in sources}
allowed={v['id']:v['modalites'] for v in json.loads((root/'codebook-complet.json').read_text())['variables']}
for a in agencies:
    assert a['score_substituabilite'] is None
    assert all(sid in sm for sid in a['reviewed_source_ids']+a['location_source_ids'])
for o in observations:
    assert o['agency_id'] in am and o['source_id'] in sm
    assert o['source_id'] in o['reviewed_source_ids']
    assert o['code'] in allowed[o['variable']]
    assert o['code']==am[o['agency_id']]['codes_proposes'][o['variable']]
    assert o['code_initial']==am[o['agency_id']]['codes_initiaux'][o['variable']]
    if o['excerpt']:assert o['excerpt'] in sm[o['source_id']]['extraits']
for s in sources:
    assert sum(len(q.split()) for q in set(s['extraits']))<=25
calculated={v:{k:sum(o['variable']==v and o['code']==k for o in observations) for k in ['P','D','I','X']} for v in allowed}
result=json.loads((root/'resultats.json').read_text())
assert calculated==result['comptes']
assert all(sum(c.values())==30 for c in calculated.values())
assert result['validation_humaine'] is True and result['scores_calcules']==0
manifest=json.loads((root/'manifest.json').read_text())
for f in manifest['files']:
    assert hashlib.sha256((root/f['path']).read_bytes()).hexdigest()==f['sha256'],f['path']
print(json.dumps({'controle':'reussi','comptes':calculated,'validation_humaine':True,'pages_html_originales_reverifiees':False},ensure_ascii=False,indent=2))
