#!/usr/bin/env python3
"""Enseña un candidato del ledger con su contexto a los dos lados.

Para adjudicar hace falta la frase entera, no el fragmento que reporta el
alineador: «foodstuffs» contra «food» no dice nada; «he offered them foodstuffs»
contra «he offered them food» ya se decide. Este script pone en columna el texto
del repo y el del OCR de Surya alrededor del candidato.

El OCR es de alta calidad, asi que sirve para separar el ruido de la lectura
real. Lo que cambie el texto se confirma despues contra la imagen — el OCR no es
prueba, es indicio.

Uso:
    python3 ver_candidato.py 15 16 45        # por indice en abiertos_*.json
    python3 ver_candidato.py --todos
"""
import json
import pathlib
import re
import sys

HERE = pathlib.Path(__file__).resolve().parent
REPO = pathlib.Path('/Users/jaganat/git_projects/vedabase-original')
SURYA = HERE / 'surya'
ABIERTOS = HERE / 'abiertos_2026-08-13.json'


def norm(s):
    return re.sub(r'\s+', ' ', re.sub(r'[^\w\s]', ' ', (s or '').lower())).strip()


def contexto(texto, aguja, margen=95):
    """Trozo de `texto` alrededor de `aguja`, comparando en normalizado."""
    n, a = norm(texto), norm(aguja)
    if not a:
        return ''
    i = n.find(a)
    if i < 0:                       # prueba con las primeras palabras
        corto = ' '.join(a.split()[:3])
        i = n.find(corto)
        if i < 0:
            return ''
    return '…' + n[max(0, i - margen): i + len(a) + margen] + '…'


def texto_surya(page):
    """`<stem>#pNNNN` -> el .surya.txt de esa pagina.

    El arbol es `surya/<libro>/<escaneo>/pNNNN.surya.txt`, con el escaneo un
    nivel por debajo del libro; buscar `surya/<escaneo>/` no encuentra nada y
    devuelve vacio en silencio, que es peor que fallar.
    """
    stem, _, pag = page.partition('#')
    for patron in (f'*/{stem}/{pag}.surya.txt', f'{stem}/{pag}.surya.txt'):
        hit = sorted(SURYA.glob(patron))
        if hit:
            return hit[0].read_text(encoding='utf-8', errors='ignore')
    return ''


def main():
    ab = json.load(open(ABIERTOS, encoding='utf-8'))
    idxs = (range(len(ab)) if '--todos' in sys.argv
            else [int(x) for x in sys.argv[1:] if x.isdigit()])
    for i in idxs:
        a = ab[i]
        f = REPO / a['file']
        t_repo = f.read_text(encoding='utf-8', errors='ignore') if f.exists() else ''
        t_scan = texto_surya(a['page'])
        print(f"\n{'=' * 78}\n[{i}] {a['libro']}  {a['file']}  {a['page']}  ({a['verdict']})")
        print(f"    repo: {a['repo']!r}")
        print(f"    scan: {a['scan']!r}")
        c1 = contexto(t_repo, a['repo']) or '(no localizado en el fichero del repo)'
        c2 = contexto(t_scan, a['scan']) or contexto(t_scan, a['repo']) or '(no localizado en el OCR)'
        print(f"  REPO  {c1}")
        print(f"  SCAN  {c2}")
    return 0


if __name__ == '__main__':
    sys.exit(main())
