#!/usr/bin/env python3
"""Desempata las divergencias mirando SU pagina del impreso, no el libro entero.

Por que hace falta. `arbitrar_deriva.py` busca cada variante en todo el OCR del
libro y por eso 53 casos salian «las dos aparecen»: «or» y «nor» estan los dos
en el Caitanya-caritamrta, claro. Pero en LA pagina donde cae el pasaje suele
haber solo una.

Como localiza la pagina. Con `pagina_de_ref.localizar`, que prueba el contexto
del repo entero y luego ventanas deslizantes cada vez mas cortas; el OCR no
reproduce el contexto palabra por palabra y exigirlo entero fallaba casi
siempre.

Que decide. Solo cuando en esa pagina aparece UNA de las dos variantes en su
contexto. Si aparecen las dos, o ninguna, se deja para la imagen — que sigue
siendo la unica prueba que el proyecto acepta para lo que cambia el texto.

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

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


def texto_pagina(ref, pag, stem):
    f = SURYA / LIBRO[ref.split('/')[0]] / stem / f'p{pag:04d}.surya.txt'
    return norm(f.read_text(encoding='utf-8', errors='ignore')) if f.exists() else ''


def main():
    lim = int(sys.argv[sys.argv.index('--limite') + 1]) if '--limite' in sys.argv else 40
    casos = [x for x in json.loads((HERE / 'deriva_arbitrada.json').read_text(encoding='utf-8'))
             if 'imagen' in x['veredicto']]
    res = {'D1 equivocado': [], 'repo equivocado': [], 'sigue sin decidir': []}
    for x in casos:
        if x['ref'].split('/')[0] not in LIBRO:
            res['sigue sin decidir'].append({**x, 'pagina': None})
            continue
        frase = ' '.join((x.get('izq', '') + ' ' + x['repo'] + ' ' + x.get('der', '')).split())
        hit = localizar(x['ref'], frase)
        if not hit:
            res['sigue sin decidir'].append({**x, 'pagina': None})
            continue
        stem, pag = hit
        t = texto_pagina(x['ref'], pag, stem)
        izq = ' '.join(norm(x.get('izq', '')).split()[-3:])
        der = ' '.join(norm(x.get('der', '')).split()[:3])
        con_r = ' '.join(y for y in (izq, norm(x['repo']), der) if y)
        con_d = ' '.join(y for y in (izq, norm(x['d1']), der) if y)
        r, d = con_r in t, con_d in t
        if r and not d:
            res['D1 equivocado'].append({**x, 'pagina': f'{stem} p.{pag}'})
        elif d and not r:
            res['repo equivocado'].append({**x, 'pagina': f'{stem} p.{pag}'})
        else:
            res['sigue sin decidir'].append({**x, 'pagina': f'{stem} p.{pag}'})
    for k, v in res.items():
        print(f'  {len(v):4}  {k}')
    (HERE / 'arbitrado_por_pagina.json').write_text(
        json.dumps(res, ensure_ascii=False, indent=1), encoding='utf-8')
    print('\n  el impreso da la razon al repo (D1 equivocado):')
    for x in res['D1 equivocado'][:lim]:
        print(f"    {x['ref']:18} {x['pagina']:14} D1={x['d1'][:24]!r:26} repo={x['repo'][:24]!r}")
    if res['repo equivocado']:
        print('\n  el impreso da la razon a D1 (mirar con imagen antes de tocar):')
        for x in res['repo equivocado'][:lim]:
            print(f"    {x['ref']:18} {x['pagina']:14} D1={x['d1'][:24]!r:26} repo={x['repo'][:24]!r}")
    return 0


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