#!/usr/bin/env python3
"""Enseña, alineadas y con contexto, las diferencias entre el repo y D1 de UNA referencia.

`paridad_completa.py` dice QUE palabras sobran o faltan, pero no DONDE. Con
palabras corrientes —«word», «or», «the»— eso no basta para arreglar nada: hay
treinta apariciones y hay que dar con la que difiere. Aqui se alinea el texto
entero y se imprime cada tramo distinto con sus palabras alrededor, que es lo
unico que permite escribir el UPDATE con seguridad.

Uso:
    python3 ver_divergencia.py kb/86
    python3 ver_divergencia.py cc/madhya/8/36 --contexto 12
"""
import difflib
import json
import os
import pathlib
import re
import subprocess
import sys

HERE = pathlib.Path(__file__).resolve().parent
ASTRO = HERE.parent.parent
REPO = pathlib.Path('/Users/jaganat/git_projects/vedabase-original')
sys.path.insert(0, str(HERE))
from verificar_paridad import ref_de  # noqa: E402
from paridad_completa import CARPETA, pal  # noqa: E402


def d1(sql):
    p = subprocess.run(['npx', 'wrangler', 'd1', 'execute', 'vedabase-search-db', '--remote',
                        '--json', '--command', sql], capture_output=True, text=True,
                       cwd=str(ASTRO),
                       env={**os.environ, 'CF_API_TOKEN': '', 'CLOUDFLARE_API_TOKEN': ''})
    return json.loads(p.stdout)[0]['results']


def main():
    ref = sys.argv[1]
    ctx = int(sys.argv[sys.argv.index('--contexto') + 1]) if '--contexto' in sys.argv else 8
    libro = ref.split('/')[0]
    fichero = None
    for f in (REPO / CARPETA[libro]).rglob('*.md'):
        if ref_de(str(f.relative_to(REPO))) == ref:
            fichero = f
            break
    if not fichero:
        sys.exit(f'sin fichero en el repo para {ref}')
    q = "'" + ref.replace("'", "''") + "'"
    fila = d1(f"SELECT COALESCE(verse_text,'') v, COALESCE(devanagari,'') d, "
              f"COALESCE(synonyms,'') s, COALESCE(translation,'') t, COALESCE(purport,'') p "
              f"FROM verses WHERE ref={q} AND lang='en'")[0]
    a = pal(fichero.read_text(encoding='utf-8'))
    b = pal(' '.join((fila['v'], fila['d'], fila['s'], fila['t'], fila['p'])))
    print(f'  {ref}   repo={len(a)} palabras   D1={len(b)}')
    sm = difflib.SequenceMatcher(None, b, a)
    # Los bloques con escritura india son casi siempre el mismo verso cambiado
    # de sitio: el .md pone la linea devanagari antes de la transliteracion y D1
    # las guarda en dos campos que aqui se concatenan al reves. No es divergencia
    # y tapa lo que si lo es, asi que fuera salvo que se pida --todo.
    todo = '--todo' in sys.argv
    indio = re.compile(r'[\u0900-\u097F\u0980-\u09FF]')
    n = 0
    for op, i1, i2, j1, j2 in sm.get_opcodes():
        if op == 'equal':
            continue
        d1t, rt = ' '.join(b[i1:i2]), ' '.join(a[j1:j2])
        if not todo and (indio.search(d1t) or indio.search(rt)):
            continue
        n += 1
        antes = ' '.join(b[max(0, i1 - ctx):i1])
        despues = ' '.join(b[i2:i2 + ctx])
        print(f'\n  [{n}] …{antes}')
        print(f'      D1  : «{" ".join(b[i1:i2])}»')
        print(f'      repo: «{" ".join(a[j1:j2])}»')
        print(f'      …{despues}')
    if not n:
        print('  sin diferencias')
    return 0


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