#!/usr/bin/env python3
"""Reescribe los veredictos de hoy con la clave que el ledger sabe leer.

El problema. `verdicts.jsonl` se indexa por `(norm(repo), norm(scan))`, y
`norm()` baja a minusculas y quita puntuacion pero NO quita diacriticos ni
convierte el punto en espacio. Los candidatos, en cambio, vienen del alineador
YA normalizados a su manera: sin diacriticos y con la puntuacion convertida en
espacio. Resultado: un veredicto escrito con el texto real ('Kṛṣṇa',
'(A.D. 1511)') no cierra el candidato ('krsna', 'a d 1511'), y los casos siguen
saliendo ABIERTOS por mucho que se hayan resuelto.

La tentacion es aflojar `norm()` para que quite diacriticos. Se probo: los
abiertos subieron de 434 a 1011 y los veredictos unicos BAJARON de 2600 a 2397,
porque al aflojar la clave casos distintos colisionan y se pisan. Mala idea.

Lo que si funciona: escribir el veredicto DOS VECES, una con el texto real y
otra con la forma del candidato. Son lineas independientes, el fichero es
append-only y ninguna clave colisiona con otra.

Uso: python3 cerrar_veredictos.py [--aplicar]
"""
import json, re, sys, glob, unicodedata, pathlib, collections

HERE = pathlib.Path(__file__).resolve().parent
LOTES = HERE / 'lotes_imagen'
FECHA = '2026-08-11'


def alineador(s):
    """La normalizacion del alineador: sin diacriticos, puntuacion a espacio."""
    s = unicodedata.normalize('NFD', (s or '').lower())
    s = ''.join(c for c in s if unicodedata.category(c) != 'Mn')
    return ' '.join(re.sub(r'[^\w\s]', ' ', s).split())


def candidatos_delete():
    """{(file, texto normalizado): registro} de la clase delete ya adjudicada."""
    out = {}
    for f in sorted(LOTES.glob('resultado*.json')):
        n = int(re.search(r'(\d+)', f.name).group(1))
        if not (80 <= n <= 89): continue
        for r in json.load(open(f, encoding='utf-8')):
            if 'texto_repo' in r:
                out[(r['file'], alineador(r['texto_repo']))] = r
    return out


def main():
    aplicar = '--aplicar' in sys.argv
    cand = candidatos_delete()
    print(f'candidatos de la clase delete ya adjudicados: {len(cand)}')

    # La fuente son las CORRECCIONES, no los ficheros de trabajo. `supresiones.json`
    # y `restauraciones.json` se sobrescriben en cada pasada del aplicador y al
    # final del dia solo conservan la ultima tanda: buscar ahi cerraba 8 de 216.
    # `corrections.jsonl` es append-only y lleva todas.
    hechas = []
    corr = pathlib.Path('/Users/jaganat/git_projects/vedabase-original/corrections.jsonl')
    for l in open(corr, encoding='utf-8'):
        try: d = json.loads(l)
        except Exception: continue
        if d.get('date') != FECHA or not d.get('file'): continue
        par = (d.get('replace') or {}).get('en') or []
        if not par: continue
        hechas.append(({'file': d['file'], 'antes': par[0], 'nota': d.get('note', ''),
                        'page': None}, 'antes'))
    print(f'correcciones registradas hoy: {len(hechas)}')

    lineas = []; casados = 0
    for x, campo in hechas:
        texto = x.get(campo, '')
        k = (x['file'], alineador(texto))
        r = cand.get(k)
        if r: casados += 1
        # se escribe SIEMPRE la forma del alineador; si ademas hay candidato,
        # se usa su `texto_repo` tal cual, que es la clave exacta del ledger
        for repo_key in {alineador(texto)} | ({r['texto_repo']} if r else set()):
            lineas.append({"repo": repo_key, "scan": "",
                           "estado": "VERIFICADO",
                           "razon": f"resuelto contra la imagen del impreso "
                                    f"(p.{x.get('page') or x.get('pagina')}): "
                                    f"{(x.get('nota') or '')[:200]}",
                           "fecha": FECHA})
    print(f'  con candidato identificado: {casados}')
    print(f'  lineas de veredicto a escribir: {len(lineas)}')
    if aplicar:
        with open(HERE / 'verdicts.jsonl', 'a') as fh:
            for l in lineas:
                fh.write(json.dumps(l, ensure_ascii=False) + '\n')
        print('escritas')
    else:
        print('(ensayo: anade --aplicar)')
    return 0


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