"""Caza de huecos en SB y CC: volumen del capitulo servido contra el del impreso.

Es el metodo que destapo el capitulo 3 del SSR y el 9 del NOD. Para cada
capitulo se compara el numero de palabras del repo con el de las paginas del
escaneo que le corresponden. Un capitulo que sirve mucho menos de lo que ocupa
en el impreso tiene texto perdido.
"""
import json,re,collections,pathlib,glob
SC=pathlib.Path('/Users/jaganat/git_projects/astro_vedabase/scripts/scan_audit')
REPO=pathlib.Path('/Users/jaganat/git_projects/vedabase-original')
PAL=re.compile(r"[A-Za-zĀāĪīŪūṚṛṄṅÑñṬṭḌḍṆṇŚśṢṣḤḥṀṁ'-]+")

def cap_de(fichero):
    m=re.search(r'sb-(\d+)\.(\d+)\.',fichero)
    if m: return ('sb',m.group(1),m.group(2))
    m=re.search(r'cc-(adi|madhya|antya)-(\d+)\.',fichero)
    if m: return ('cc',m.group(1),m.group(2))
    return None

for libro,cands in (('srimad-bhagavatam','srimad-bhagavatam'),('sri-caitanya-caritamrta','sri-caitanya-caritamrta')):
    pags=collections.defaultdict(set); vols=collections.defaultdict(set)
    for l in open(SC/'out_surya'/f'{cands}.candidates.jsonl',encoding='utf-8'):
        d=json.loads(l); c=cap_de(d['file'])
        if not c: continue
        pg=(d.get('page') or '')
        vol,p=pg.split('#') if '#' in pg else ('','')
        if p.startswith('p'): pags[c].add(int(p[1:])); vols[c].add(vol)
    filas=[]
    for c,ps in sorted(pags.items()):
        if len(ps)<3: continue
        vol=sorted(vols[c])[0]
        d=SC/'surya'/libro/vol
        if not d.exists(): continue
        # El rango min..max lo dispara cualquier candidato suelto en otra parte
        # del volumen (sb/7/10 salia con 324 paginas). Se usa el GRUPO CONTIGUO
        # mayor: se parte la lista donde haya un salto de mas de 15 paginas.
        orden=sorted(ps); grupos=[[orden[0]]]
        for x in orden[1:]:
            if x-grupos[-1][-1]>15: grupos.append([x])
            else: grupos[-1].append(x)
        mayor=max(grupos,key=len)
        lo,hi=mayor[0],mayor[-1]
        txt=' '.join((d/f'p{n:04d}.surya.txt').read_text(encoding='utf-8',errors='ignore')
                     for n in range(lo,hi+1) if (d/f'p{n:04d}.surya.txt').exists())
        n_ocr=len(PAL.findall(txt))
        if c[0]=='sb': patron=str(REPO/'srimad-bhagavatam'/f'canto-{int(c[1]):02d}'/f'chapter-{int(c[2]):02d}'/'*.md')
        else: patron=str(REPO/'sri-caitanya-caritamrta'/f'{c[1]}-lila'/f'chapter-{int(c[2]):02d}'/'*.md')
        n_repo=sum(len(PAL.findall(open(f,encoding='utf-8').read())) for f in glob.glob(patron))
        if n_ocr>500 and n_repo:
            filas.append((c,n_repo,n_ocr,round(n_repo/n_ocr,3),hi-lo+1))
    filas.sort(key=lambda x:x[3])
    print(f'=== {libro}: {len(filas)} capitulos comparados')
    print(f'  {"capitulo":16} {"repo":>7} {"impreso":>8} {"ratio":>6}  paginas')
    for c,a,b,r,np in filas[:12]:
        print(f'  {"/".join(c):16} {a:7} {b:8} {r:6}  {np}')
