#!/usr/bin/env python3
"""Deshace en el repo los reemplazos que se pasaron de sitio.

Que arregla. Las restauraciones de erratas y de lecturas del impreso se
aplicaron con un reemplazo por fichero, y alcanzaron ocurrencias donde el papel
NO dice eso. Verificado sobre la imagen en tres libros distintos:

    kb/75          el impreso dice «their arrows also harassed» (una ese) y el
                   repo pone «harrassed», que es la errata de kb/64 y kb/81
    cc/antya/2/16  el impreso dice «a cit» la primera vez —esa es la errata— y
                   «In this city» la segunda; el repo puso «cit» en las dos
    sb/3/22/16     el impreso dice «sons and grandsons… Kṛṣṇa's grandson», y el
                   repo puso el singular en los dos sitios

Por conservar una errata se introdujo otra, y no se veia: el diff de Surya da
esas ocurrencias por buenas, porque el repo «coincide» con la errata ya
adjudicada.

De donde salen los casos. De `leer_palabra_impreso.py` sobre los bloques que el
arbitraje marca «repo equivocado»: los que la palabra leida del impreso
coincide con D1 y no con el repo.

Uso:
    python3 deshacer_reemplazo_pasado.py            # ensayo
    python3 deshacer_reemplazo_pasado.py --aplicar
"""
import json
import pathlib
import re
import sys

HERE = pathlib.Path(__file__).resolve().parent
REPO = pathlib.Path('/Users/jaganat/git_projects/vedabase-original')
LOG = REPO / 'corrections.jsonl'
sys.path.insert(0, str(HERE))
from pagina_de_ref import localizar, norm  # noqa: E402
from arbitrar_por_pagina import texto_pagina  # noqa: E402
from leer_palabra_impreso import palabra_tras  # noqa: E402

ENTRE = r'(?:[\s]|\*|_|\n)+'
# Sin limite de palabra, «as» casa dentro de «brāhmaṇas» y el reemplazo
# produce «brāhmaṇto be». Me paso el 15-ago: el script cometio exactamente
# el error que estaba buscando.
LIMITE = r'(?<![\w\u0100-\u1EFF])%s(?![\w\u0100-\u1EFF])'


def main():
    aplicar = '--aplicar' in sys.argv
    bloques = [x for x in json.loads((HERE / 'deriva_arbitrada.json').read_text(encoding='utf-8'))
               if x['veredicto'] == 'repo equivocado']
    n = saltados = 0
    for x in bloques:
        frase = ' '.join((x.get('izq', '') + ' ' + x['repo'] + ' ' + x.get('der', '')).split())
        hit = localizar(x['ref'], frase)
        if not hit:
            saltados += 1
            continue
        stem, pag = hit
        w = palabra_tras(texto_pagina(x['ref'], pag, stem), norm(x.get('izq', '')))
        dd = norm(x['d1']).split()
        # solo cuando el impreso dice EXACTAMENTE lo que dice D1
        if not w or not dd or w != dd[0]:
            saltados += 1
            continue
        f = REPO / x['file']
        if not f.exists():
            saltados += 1
            continue
        t = f.read_text(encoding='utf-8')
        izq = x.get('izq', '').split()[-3:]
        colocado = False
        for ni in (3, 2, 1):
            viejo = ' '.join(izq[-ni:] + [x['repo']])
            pat = ENTRE.join(re.escape(p) for p in viejo.split())
            m = list(re.finditer(pat, t))
            if len(m) != 1:
                continue
            tramo = m[0].group(0)
            dentro = re.sub(LIMITE % ENTRE.join(re.escape(p) for p in x['repo'].split()),
                            lambda _: x['d1'], tramo, count=1)
            if dentro == tramo:
                continue
            print(f"  {x['ref']:16} {x['repo'][:18]!r:20} -> {x['d1'][:18]!r:20} "
                  f"({stem} p.{pag}, contexto {ni})")
            if aplicar:
                f.write_text(t[:m[0].start()] + dentro + t[m[0].end():], encoding='utf-8')
                with LOG.open('a', encoding='utf-8') as fh:
                    fh.write(json.dumps(
                        {'ref': None, 'field': 'purport/translation', 'file': x['file'],
                         'replace': {'en': [viejo, ' '.join(izq[-ni:] + [x['d1']])]},
                         'note': f'reemplazo pasado de sitio: el impreso ({stem} p.{pag}) dice '
                                 f'{x["d1"]!r} aqui. La restauracion de la lectura/errata se '
                                 f'aplico al fichero entero'}, ensure_ascii=False) + '\n')
            n += 1
            colocado = True
            break
        if not colocado:
            saltados += 1
    print(f'\n  a deshacer: {n}   saltados: {saltados}')
    if not aplicar:
        print('  (ensayo: anade --aplicar)')
    return 0


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