#!/usr/bin/env python3
"""Lee del impreso la palabra que ocupa el sitio de la divergencia.

Por que otro arbitro mas. `arbitrar_por_pagina.py` exige que el contexto
COMPLETO —izquierda + variante + derecha— aparezca literal en el OCR de la
pagina, y eso falla en 35 de 40 casos: basta una coma, una cursiva mal leida o
un guion de fin de linea para que no case.

Aqui no se comprueba una hipotesis, se LEE: se busca el contexto izquierdo en
la pagina y se mira que palabra viene justo detras. Si es la del repo, el
equivocado es D1; si es la de D1, el equivocado es el repo; si es otra tercera,
se informa, porque entonces ninguno de los dos coincide con el impreso y hace
falta mirar la pagina de verdad.

El contexto izquierdo se prueba de cuatro palabras y, si no aparece, de tres y
de dos. Con menos de dos no se decide: cualquier palabra sale muchas veces.

Uso: python3 leer_palabra_impreso.py [--limite 40]
"""
import json
import pathlib
import sys

HERE = pathlib.Path(__file__).resolve().parent
sys.path.insert(0, str(HERE))
from arbitrar_por_pagina import texto_pagina  # noqa: E402
from pagina_de_ref import norm  # noqa: E402


def palabra_tras(texto, izq):
    """La palabra que sigue a `izq` en `texto`, o None si no es inequivoco."""
    pal = izq.split()
    for n in (4, 3, 2):
        if len(pal) < n:
            continue
        aguja = ' '.join(pal[-n:])
        pos = [i for i in range(len(texto)) if texto.startswith(aguja, i)]
        if len(pos) != 1:
            continue
        resto = texto[pos[0] + len(aguja):].split()
        if resto:
            return resto[0]
    return None


def main():
    lim = int(sys.argv[sys.argv.index('--limite') + 1]) if '--limite' in sys.argv else 40
    d = json.loads((HERE / 'arbitrado_por_pagina.json').read_text(encoding='utf-8'))['sigue sin decidir']
    res = {'D1 equivocado': [], 'repo equivocado': [], 'el impreso dice otra cosa': [],
           'no se puede leer': []}
    for x in d:
        if not x.get('pagina'):
            res['no se puede leer'].append(x)
            continue
        stem, pag = x['pagina'].split(' p.')
        t = texto_pagina(x['ref'], int(pag), stem)
        w = palabra_tras(t, norm(x.get('izq', '')))
        if not w:
            res['no se puede leer'].append(x)
            continue
        r, dd = norm(x['repo']).split(), norm(x['d1']).split()
        x = {**x, 'impreso': w}
        if r and w == r[0]:
            res['D1 equivocado'].append(x)
        elif dd and w == dd[0]:
            res['repo equivocado'].append(x)
        else:
            res['el impreso dice otra cosa'].append(x)
    for k, v in res.items():
        print(f'  {len(v):4}  {k}')
    (HERE / 'leido_del_impreso.json').write_text(
        json.dumps(res, ensure_ascii=False, indent=1), encoding='utf-8')
    for k in ('D1 equivocado', 'repo equivocado', 'el impreso dice otra cosa'):
        if not res[k]:
            continue
        print(f'\n  {k}:')
        for x in res[k][:lim]:
            print(f"    {x['ref']:18} {x['pagina']:14} impreso={x['impreso'][:18]!r:20} "
                  f"D1={x['d1'][:16]!r:18} repo={x['repo'][:16]!r}")
    return 0


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