#!/usr/bin/env python3
"""Carga en D1 las erratas del impreso que se reproducen a proposito.

Por que en D1 y no leyendo el `.md`. La lista vive hoy en
`PRINT_ERRATA_PRESERVED.md` y en su gemelo en espanol, que son para leer. La
pagina publica necesita otra cosa: poder ordenar, agrupar y enlazar cada entrada
a su verso. Si la pagina leyera el markdown, el dia que aparezca la errata 78
habria que acordarse de tocar dos sitios. Con la tabla hay una sola fuente y los
documentos se regeneran de ella.

  ref        el verso o capitulo, como en `verses`
  kind       el tipo: spelling | name | gloss | grammar | fact | numbering
  digital    lo que decia el texto digital, que suele ser lo correcto en ingles
  printed    lo que dice el papel, y lo que sirve el sitio
  page       la pagina impresa donde se verifico
  note       aclaracion, solo en los casos que la piden

Uso:
    python3 cargar_erratas_d1.py --crear
    python3 cargar_erratas_d1.py --cargar
"""
import json, os, re, sys, subprocess, pathlib

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

DDL = """
CREATE TABLE IF NOT EXISTS print_errata (
  id       INTEGER PRIMARY KEY AUTOINCREMENT,
  ref      TEXT NOT NULL,
  kind     TEXT NOT NULL,
  digital  TEXT NOT NULL,
  printed  TEXT NOT NULL,
  page     TEXT,
  note     TEXT,
  UNIQUE(ref, digital, printed)
);
CREATE INDEX IF NOT EXISTS idx_errata_kind ON print_errata(kind);
"""

# los cuatro que piden aclaracion, porque un lector puede llevarse algo falso
NOTAS = {
    'paṭa-ādi—space, etc.;':
        'The word-for-word glosses paṭa-ādi as “space”; the sense is cloth and plates.',
    'adhara—lies;':
        'The word-for-word glosses adhara as “lies”; the word means lips.',
    'son-god':
        'The word-for-word on this same verse has the sun-god.',
    'a verse from the Bhobishya Purana':
        'The verse is from the Skanda Purāṇa. Not a spelling variant: a different scripture.',
    '(formerly known as Dabir Khās)':
        'Dabir Khās was Rūpa Gosvāmī’s name in government service; Sanātana’s was Sākara Mallika.',
}

TIPO = {'ortografia': 'spelling', 'nombre': 'name', 'sentido': 'gloss',
        'gramatica': 'grammar', 'hecho': 'fact', 'numeracion': 'numbering'}

# reclasificacion curada: terminos sanscritos que la heuristica metia en
# «ortografia» y glosas que son del word-for-word
SANS = {'antaryāmī', 'dharmān', 'manuḥ', 'Cakravartī', 'Yudhiṣṭhira', 'Mādhavendra',
        'Yajña', 'Janamejaya', 'Balabhit', 'vayu', 'kaṇṭhī', 'sattva', 'Śikṣāṣṭaka',
        'Vorontsov', 'Nikolai', 'Rāmānujācārya'}


def pagina(nota):
    m = re.search(r'p\.?\s*(\d+)\s*impresa|impres[ao]\s*p\.?\s*(\d+)|p\.\s*(\d+)', nota or '')
    return next((g for g in m.groups() if g), '') if m else ''


def ejecutar(sql):
    f = HERE / '_errata.sql'
    f.write_text(sql, encoding='utf-8')
    p = subprocess.run(['npx', 'wrangler', 'd1', 'execute', 'vedabase-search-db',
                        '--remote', '--file', str(f)], capture_output=True, text=True,
                       cwd=str(ASTRO),
                       env={**os.environ, 'CF_API_TOKEN': '', 'CLOUDFLARE_API_TOKEN': ''})
    f.unlink(missing_ok=True)
    ok = 'rows_written' in p.stdout or 'Executed' in p.stdout
    if not ok: print(p.stdout[-500:], p.stderr[-300:])
    return ok


def main():
    if '--crear' in sys.argv:
        print('tabla print_errata:', 'creada' if ejecutar(DDL) else 'FALLO')
        return 0
    if '--ver' in sys.argv:
        for r in d1("SELECT kind, COUNT(*) c FROM print_errata GROUP BY kind", js=True):
            print(f"  {r['c']:4}  {r['kind']}")
        print('  total:', d1("SELECT COUNT(*) c FROM print_errata", js=True)[0]['c'])
        return 0
    if '--cargar' not in sys.argv:
        print(__doc__); return 1

    g = json.loads(pathlib.Path('/tmp/grupos.json').read_text(encoding='utf-8'))
    stmts = []; n = 0
    for grupo, filas in g.items():
        for x in filas:
            ref = ref_de(x['file']) if x['file'] else 'sb/0b'
            if not ref: continue
            ref = re.sub(r'^ejotp/', 'ej/', ref)
            viejo, nuevo = x['viejo'], x['nuevo']
            kind = TIPO.get(grupo, 'spelling')
            if kind == 'spelling' and any(s.lower() in viejo.lower() for s in SANS):
                kind = 'name'
            if '—' in viejo:
                kind = 'gloss'
            if not viejo and not nuevo:
                viejo, nuevo = 'list numbered straight through', 'print jumps from 45 to 48'
            stmts.append(
                "INSERT INTO print_errata (ref, kind, digital, printed, page, note) VALUES ("
                f"{q(ref)}, {q(kind)}, {q(viejo)}, {q(nuevo)}, {q(pagina(x.get('note')))}, "
                f"{q(NOTAS.get(nuevo, ''))}) ON CONFLICT(ref, digital, printed) DO UPDATE SET "
                "kind=excluded.kind, page=excluded.page, note=excluded.note;")
            n += 1
    print(f'erratas a cargar: {n}')
    print('cargadas' if ejecutar('\n'.join(stmts)) else 'FALLO')
    return 0


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