#!/usr/bin/env python3
"""Corrige en D1 las divergencias que la imagen del impreso da al repo.

De donde salen. Al sincronizar aparecieron referencias en las que D1 y el repo
dicen cosas distintas por motivos ANTERIORES a esta auditoria — huele a texto de
la edicion REVISADA colado en la base, que es exactamente lo que vedabase.cc no
debe servir. No se tocaron entonces: una divergencia detectada no es una
divergencia adjudicada.

Ahora si: cada par se ha mirado en el escaneo (`resultado108.json`) y el impreso
respalda al repo en los siete. Esto solo escribe los pares que traen veredicto
IMPRESO=REPO; lo demas no se toca aunque diverja.

El cambio va ANCLADO al contexto del repo, no como un REPLACE global: 'or' y
'object' aparecen decenas de veces en un significado y una sustitucion a ciegas
los cambiaria todos.

Uso: python3 corregir_divergencias_d1.py [--aplicar]
"""
import json, re, sys, os, subprocess, pathlib

HERE = pathlib.Path(__file__).resolve().parent
ASTRO = pathlib.Path('/Users/jaganat/git_projects/astro_vedabase')
REPO = pathlib.Path('/Users/jaganat/git_projects/vedabase-original')
sys.path.insert(0, str(HERE))
from sincronizar_diff import d1, q, patron
from verificar_paridad import ref_de

FECHA = '2026-08-11'


def fichero_de(ref):
    """El .md INGLES de una referencia. Las traducciones tienen el mismo nombre
    bajo translations/<idioma>/ y hay que dejarlas fuera."""
    for f in subprocess.run(['git', 'ls-files'], capture_output=True, text=True,
                            cwd=str(REPO)).stdout.splitlines():
        if f.endswith('.md') and not f.startswith('translations/') and ref_de(f) == ref:
            return f
    return None


def main():
    aplicar = '--aplicar' in sys.argv
    casos = [r for r in json.load(open(HERE / 'lotes_imagen/resultado108.json', encoding='utf-8'))
             if r.get('veredicto') == 'IMPRESO=REPO']
    print(f'pares con el impreso a favor del repo: {len(casos)}')

    ok = fallo = 0
    for c in casos:
        ref = c['ref']
        f = fichero_de(ref)
        if not f: print(f'  {ref}: sin fichero'); fallo += 1; continue
        txt = (REPO / f).read_text(encoding='utf-8')
        filas = d1(f"SELECT COALESCE(purport,'') p, COALESCE(translation,'') t "
                   f"FROM verses WHERE ref={q(ref)} AND lang='en'", js=True)
        if not filas: print(f'  {ref}: sin fila en D1'); fallo += 1; continue
        r = filas[0]
        viejo = re.sub(r'\s*\(x\d+\)\s*$', '', c['d1']).strip()
        nuevo = c['repo'].strip()
        stmts = []
        # Ancla: la ventana del REPO alrededor de la palabra buena, con la
        # palabra mala puesta en su sitio. Se prueban varias anchuras porque una
        # larga puede cruzar la frontera translation/purport.
        for lados in (8, 5, 3, 2):
            for m in re.finditer(rf'\b{re.escape(nuevo)}\b', txt):
                ini, fin = m.start(), m.end()
                for _ in range(lados):
                    j = txt.rfind(' ', 0, ini)
                    if j < 0: break
                    ini = j
                for _ in range(lados):
                    j = txt.find(' ', fin + 1)
                    if j < 0: break
                    fin = j
                trozo = txt[ini:fin]
                antes = trozo.replace(nuevo, viejo, 1) if viejo in trozo.replace(nuevo, viejo, 1) \
                        else trozo[:m.start() - ini] + viejo + trozo[m.end() - ini:]
                for campo, val in (('purport', r['p']), ('translation', r['t'])):
                    ms = list(patron(antes.strip()).finditer(val))
                    if len(ms) != 1: continue
                    lit = ms[0].group(0)
                    rep = lit.replace(viejo, nuevo, 1)
                    if rep == lit: continue
                    stmts.append(f"UPDATE verses SET {campo}=REPLACE({campo},{q(lit)},{q(rep)}) "
                                 f"WHERE ref={q(ref)} AND lang='en';")
                    break
                if stmts: break
            if stmts: break
        if not stmts:
            print(f'  {ref}: sin ancla unica para {viejo!r} -> {nuevo!r}'); fallo += 1; continue
        print(f'  {ref}: {viejo!r} -> {nuevo!r}   ({c.get("nota","")[:70]})')
        if aplicar:
            sql = HERE / '_div.sql'
            sql.write_text('\n'.join(stmts) + '\n', encoding='utf-8')
            p = subprocess.run(['npx', 'wrangler', 'd1', 'execute', 'vedabase-search-db',
                                '--remote', '--file', str(sql)], capture_output=True, text=True,
                               cwd=str(ASTRO),
                               env={**os.environ, 'CF_API_TOKEN': '', 'CLOUDFLARE_API_TOKEN': ''})
            sql.unlink(missing_ok=True)
            if 'rows_written' in p.stdout: ok += 1
            else: print('     FALLO en D1'); fallo += 1
    print(f'\ncorregidas en D1: {ok} | fallos: {fallo}')
    return 0


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