"""
ERGON - Inicializacion idempotente de la base SQLite.
Aplica el DDL de init_db.sql sobre ergon.db.

Uso:
    python init_db.py            # crea o actualiza ergon.db
    python init_db.py --reset    # borra ergon.db y la recrea desde cero

La DB queda en el mismo directorio que este script.
"""
import argparse
import sqlite3
import sys
from pathlib import Path

if sys.stdout.encoding and sys.stdout.encoding.lower() != "utf-8":
    sys.stdout.reconfigure(encoding="utf-8")

HERE = Path(__file__).parent
DB_PATH = HERE / "ergon.db"
DDL_PATH = HERE / "init_db.sql"


def apply_ddl(db_path: Path, ddl_path: Path) -> None:
    ddl = ddl_path.read_text(encoding="utf-8")
    conn = sqlite3.connect(str(db_path))
    try:
        conn.executescript(ddl)
        conn.commit()
    finally:
        conn.close()


def list_schema(db_path: Path) -> None:
    conn = sqlite3.connect(str(db_path))
    try:
        cur = conn.cursor()
        cur.execute("SELECT name FROM sqlite_master WHERE type='table' ORDER BY name")
        tables = [r[0] for r in cur.fetchall()]
        print(f"  tablas ({len(tables)}): {tables}")
        cur.execute("SELECT name FROM sqlite_master WHERE type='index' AND name NOT LIKE 'sqlite_%' ORDER BY name")
        indices = [r[0] for r in cur.fetchall()]
        print(f"  indices ({len(indices)}): {indices}")
    finally:
        conn.close()


def main() -> int:
    ap = argparse.ArgumentParser(description="Inicializa ergon.db (idempotente).")
    ap.add_argument("--reset", action="store_true", help="Borra ergon.db antes de crear")
    args = ap.parse_args()

    if not DDL_PATH.exists():
        print(f"ERROR: no existe {DDL_PATH}", file=sys.stderr)
        return 2

    if args.reset and DB_PATH.exists():
        print(f"[reset] borrando {DB_PATH}")
        DB_PATH.unlink()

    existed = DB_PATH.exists()
    print(f"{'actualizando' if existed else 'creando'} {DB_PATH}")

    apply_ddl(DB_PATH, DDL_PATH)

    print("OK. Schema aplicado.")
    list_schema(DB_PATH)
    return 0


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