#!/usr/bin/env python3
"""Comprueba que cada errata del impreso se restauro SOLO donde toca.

El problema, descubierto el 15-ago. Las erratas que el proyecto reproduce a
proposito —«harrassed», «a cit»— se restauraron en el repo con un reemplazo por
fichero, y el reemplazo alcanzo ocurrencias donde el impreso NO trae la errata:

    kb/75          el impreso dice «their arrows also harassed», con una ese,
                   y el repo pone «harrassed» tambien ahi
    cc/antya/2/16  el impreso dice «a cit» la primera vez y «In this city» la
                   segunda; el repo puso «cit» en las dos

Es decir: por conservar una errata se introdujo otra. Y no se veia, porque el
diff de Surya da esas ocurrencias por buenas —el repo «coincide» con la errata
que ya se habia adjudicado— y el cotejo con D1 las marcaba «repo equivocado»,
que es facil descartar como ruido.

Que hace. Para cada entrada de `print_errata`, busca en el repo TODAS las
ocurrencias de la forma impresa y lee en el escaneo que dice el papel en cada
sitio. Informa las que no coinciden.

Uso: python3 verificar_erratas_aplicadas.py
"""
import json
import pathlib
import re
import sys

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

CARPETA = {v: k for k, v in {
    'bhagavad-gita-as-it-is': 'bg', 'srimad-bhagavatam': 'sb',
    'sri-caitanya-caritamrta': 'cc', 'krsna-the-supreme-personality-of-godhead': 'kb',
    'teachings-of-lord-caitanya': 'tlc', 'science-of-self-realization': 'ssr',
    'nectar-of-devotion': 'nod', 'isopanisad': 'iso',
    'teachings-of-queen-kunti': 'tqk'}.items()}


_MAPA = {}


def ficheros_de(ref):
    """El .md del repo que corresponde a esa referencia, no el libro entero.

    Mirar todo el libro era un error de bulto: la restauracion de la errata se
    aplico POR FICHERO, asi que solo ahi puede haberse pasado de sitio. Sin este
    filtro la barrida reportaba cada «take» del Bhagavatam como sospechoso.
    """
    from verificar_paridad import ref_de
    libro = ref.split('/')[0]
    carp = CARPETA.get(libro)
    if not carp or not (REPO / carp).is_dir():
        return []
    if carp not in _MAPA:
        m = {}
        for f in (REPO / carp).rglob('*.md'):
            r = ref_de(str(f.relative_to(REPO)))
            if r:
                m.setdefault(r, []).append(f)
        _MAPA[carp] = m
    return _MAPA[carp].get(ref, [])


def main():
    filas = d1("SELECT ref, digital, printed FROM print_errata ORDER BY ref", js=True)
    print(f'  erratas en la tabla: {len(filas)}')
    sospechas = []
    for e in filas:
        impresa, digital = e['printed'].strip(), e['digital'].strip()
        if len(impresa) < 4 or ' ' in impresa or impresa == digital:
            continue                      # solo palabras sueltas, que es donde pega el reemplazo
        for f in ficheros_de(e['ref']):
            t = f.read_text(encoding='utf-8')
            for m in re.finditer(re.escape(impresa), t):
                izq = ' '.join(t[:m.start()].split()[-4:])
                hit = localizar(e['ref'], izq + ' ' + impresa)
                if not hit:
                    continue
                stem, pag = hit
                w = palabra_tras(texto_pagina(e['ref'], pag, stem), norm(izq))
                if not w:
                    continue
                if w != norm(impresa).split()[0]:
                    sospechas.append({'ref': e['ref'], 'fichero': str(f.relative_to(REPO)),
                                      'repo': impresa, 'impreso': w, 'digital': digital,
                                      'pagina': f'{stem} p.{pag}',
                                      'contexto': ' '.join((izq + ' [' + impresa + ']').split())})
    # Falso positivo conocido, comprobado sobre la imagen (mad3 p.409): el OCR
    # lee «unneccessarily» con doble s y el papel escribe «unneccesarily», que
    # es lo que sirve el sitio. Se deja en la salida a proposito, con esta nota,
    # en vez de filtrarlo: filtrarlo callaria tambien un fallo real futuro.
    print(f'  ocurrencias donde el impreso NO trae la errata: {len(sospechas)}')
    print('  (cc/madhya/9/155 «unneccesarily» es falso positivo del OCR, '
          'verificado sobre la imagen)')
    for s in sospechas:
        print(f"    {s['ref']:16} {s['pagina']:12} repo={s['repo']!r} impreso={s['impreso']!r}")
        print(f"        …{s['contexto'][-70:]}")
    (HERE / 'erratas_pasadas_de_sitio.json').write_text(
        json.dumps(sospechas, ensure_ascii=False, indent=1), encoding='utf-8')
    return 0


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