"""
Migration -- agrega columnas a daily_log para soportar el parser de bitacora.

Ejecutar:
    cd 02_HERRAMIENTAS/db
    python migrate_parser_bitacora.py

Idempotente: usa pragma table_info para chequear si la columna existe antes
de intentar el ALTER. Corre varias veces sin efecto secundario.

Columnas agregadas:
  - parse_estado          TEXT   null|pending|proposed|confirmed|skipped|error
  - parse_borrador        TEXT   JSON del borrador que devolvio el parser
  - acciones_derivadas    TEXT   JSON de las filas creadas al confirmar
  - parse_procesado_at    TEXT   ISO timestamp UTC cuando corrio el parser
  - parse_confirmado_at   TEXT   ISO timestamp UTC cuando el usuario confirmo
  - parse_confirmado_por  TEXT   nombre de usuario que confirmo

Rollback: SQLite 3.35+ soporta DROP COLUMN; igualmente recomendado backup
antes de correr cualquier cambio estructural en prod.
"""
from __future__ import annotations

import os
import sqlite3
from pathlib import Path

DB_PATH = Path(os.environ.get("DATABASE_PATH") or (Path(__file__).parent / "ergon.db"))

NEW_COLUMNS = [
    ("parse_estado",         "TEXT"),
    ("parse_borrador",       "TEXT"),
    ("acciones_derivadas",   "TEXT"),
    ("parse_procesado_at",   "TEXT"),
    ("parse_confirmado_at",  "TEXT"),
    ("parse_confirmado_por", "TEXT"),
]

NEW_INDEX = (
    "idx_daily_log_parse_estado",
    "CREATE INDEX IF NOT EXISTS idx_daily_log_parse_estado "
    "ON daily_log (obra_id, parse_estado)"
)


def main() -> None:
    if not DB_PATH.exists():
        raise SystemExit(f"ergon.db no encontrada en {DB_PATH}")

    conn = sqlite3.connect(str(DB_PATH))
    conn.execute("PRAGMA foreign_keys = ON")
    try:
        cols_existentes = {row[1] for row in
                           conn.execute("PRAGMA table_info(daily_log)").fetchall()}
        print(f"  [migrate_parser] columnas existentes: {sorted(cols_existentes)}")

        agregadas = 0
        for col_name, col_type in NEW_COLUMNS:
            if col_name in cols_existentes:
                print(f"  [skip] {col_name} (ya existe)")
                continue
            sql = f"ALTER TABLE daily_log ADD COLUMN {col_name} {col_type}"
            conn.execute(sql)
            print(f"  [ok]   {sql}")
            agregadas += 1

        # Indice para listar rapidamente logs con parse pendiente/proposto
        conn.execute(NEW_INDEX[1])
        print(f"  [ok]   {NEW_INDEX[0]}")

        conn.commit()

        # Verificacion final
        cols_finales = {row[1] for row in
                        conn.execute("PRAGMA table_info(daily_log)").fetchall()}
        faltantes = {c for c, _ in NEW_COLUMNS} - cols_finales
        if faltantes:
            raise SystemExit(f"  [ERROR] columnas faltantes tras migracion: {faltantes}")
        print(f"  [migrate_parser] agregadas {agregadas} columnas. Total: {len(cols_finales)}")
        print("  [migrate_parser] OK")
    finally:
        conn.close()


if __name__ == "__main__":
    main()
