#!/usr/bin/env python3
"""Crea la tabla `notes` en D1 y carga las notas sobre el impreso.

Que es. Una capa APARTE del texto. La tabla `verses` no se toca: el texto que se
sirve sigue siendo el del impreso, letra por letra. Aqui solo vive el aparato —
lo que se le dice al lector sobre lo que esta leyendo — y por eso va en su propia
tabla y no en una columna mas de `verses`.

  ref        el verso o capitulo, igual que en `verses`
  field      donde cae: synonyms | translation | purport | verse_text | devanagari
  anchor     el texto exacto que se marca. Se aplica sobre el TEXTO RENDERIZADO,
             no sobre el markdown: en el fichero la glosa es `*adhara*—lies;` y
             en la pagina es `adhara—lies;`
  note_en    la nota. Describe el impreso; no enmienda a Prabhupada
  scan_pdf   el PDF del escaneo y la pagina, para el recorte
  scan_page
  links      referencias del propio sitio que la nota cita, separadas por espacio

Uso:
    python3 crear_notas_d1.py --crear     # solo la tabla
    python3 crear_notas_d1.py --cargar    # inserta/actualiza las notas
    python3 crear_notas_d1.py --ver       # que hay ahora en D1
"""
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 notes (
  id        INTEGER PRIMARY KEY AUTOINCREMENT,
  ref       TEXT NOT NULL,
  lang      TEXT NOT NULL DEFAULT 'en',
  field     TEXT NOT NULL,
  anchor    TEXT,
  kind      TEXT NOT NULL DEFAULT 'print',
  note      TEXT NOT NULL,
  scan_pdf  TEXT,
  scan_page INTEGER,
  links     TEXT,
  UNIQUE(ref, lang, field, anchor)
);
CREATE INDEX IF NOT EXISTS idx_notes_ref ON notes(ref, lang);
"""


def ejecutar(sql):
    f = HERE / '_notes.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[-600:], p.stderr[-400:])
    return ok


def main():
    if '--crear' in sys.argv:
        print('tabla notes:', 'creada' if ejecutar(DDL) else 'FALLO')
        return 0
    if '--ver' in sys.argv:
        for r in d1("SELECT ref, field, substr(anchor,1,28) a, substr(note,1,60) n "
                    "FROM notes ORDER BY ref", js=True):
            print(f"  {r['ref']:24} {r['field']:12} {r['a']!r:32} {r['n']}")
        print(' total:', d1("SELECT COUNT(*) c FROM notes", js=True)[0]['c'])
        return 0
    if '--cargar' not in sys.argv:
        print(__doc__); return 1

    notas = json.loads((HERE / 'notas_impreso.json').read_text(encoding='utf-8'))
    stmts = []
    for x in notas:
        ref = ref_de(x['ref_file']) if x['ref_file'] else None
        # `ref_de` es el mapeo del auditor; D1 usa otro prefijo para Easy Journey
        if ref: ref = re.sub(r'^ejotp/', 'ej/', ref)
        if not ref:
            print(f"  sin ref: {x['ref_file']}"); continue
        stmts.append(
            "INSERT INTO notes (ref, lang, field, anchor, kind, note, scan_page, links) VALUES ("
            f"{q(ref)}, 'en', {q(x['field'])}, {q(x.get('anchor') or '')}, 'print', "
            f"{q(x['note_en'])}, {x.get('scan_pdf_page') or 'NULL'}, "
            f"{q(' '.join(x.get('links') or []))}) "
            "ON CONFLICT(ref, lang, field, anchor) DO UPDATE SET "
            "note=excluded.note, scan_page=excluded.scan_page, links=excluded.links;")
    print(f'notas a cargar: {len(stmts)}')
    print('cargadas' if ejecutar('\n'.join(stmts)) else 'FALLO')
    return 0


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