"""Clasifica los candidatos abiertos por DECIDIBILIDAD, con un indice de palabras
del escaneo (una regex por candidato tardaba horas)."""
import json,collections,re,pathlib,unicodedata

def sd(s):
    """Sin diacriticos. El alineador los quita antes de comparar, asi que los
    candidatos vienen ya despojados; si el indice del escaneo los conserva, las
    busquedas fallan y todo parece 'inexistente'."""
    return ''.join(c for c in unicodedata.normalize('NFD', s)
                   if unicodedata.category(c) != 'Mn')
SC=pathlib.Path(__file__).resolve().parent
TOK=re.compile(r"[a-záéíóúāīūṛṅñṭḍṇśṣḥṁ']+")
idx={}
def indice(lib):
    if lib not in idx:
        d=SC/'surya'/lib
        ds=[x for x in d.iterdir() if x.is_dir()] if d.exists() else []
        c=collections.Counter()
        for sub in ds:
            for p in sub.glob('*.surya.txt'):
                c.update(TOK.findall(sd(p.read_text(encoding='utf-8',errors='ignore')).lower()))
        idx[lib]=c
    return idx[lib]
rows=[json.loads(l) for l in open(SC/'ledger.jsonl',encoding='utf-8')]
ab=[r for r in rows if r['estado']=='ABIERTO']
c=collections.Counter(); detalle=[]
for r in ab:
    a=sd((r.get('repo') or '')).strip().lower(); s=sd((r.get('scan') or '')).strip().lower()
    if not (a and s and ' ' not in a and ' ' not in s):
        c['no es par de una palabra']+=1; continue
    w=indice(r['libro'])
    if not w: c['sin OCR']+=1; continue
    na,nb=w.get(a,0),w.get(s,0)
    if nb==0: k='la lectura del impreso NO existe en el libro: ruido de OCR'
    elif nb==1: k='la lectura del impreso aparece 1 vez: requiere imagen'
    elif na==0: k='aplicable por recuento'
    else: k='ambas formas en el libro: requiere imagen'
    c[k]+=1; detalle.append((r['libro'],a,s,na,nb,k))
for k,v in c.most_common(): print(f'  {v:5}  {k}')
json.dump(detalle,open(SC/'clasificacion.json','w'),ensure_ascii=False)
