"""
Migration F-Supabase: bridge ERGON usuarios <-> Supabase Auth

Agrega columna `supabase_uid TEXT UNIQUE NULL` a tabla `usuarios` para enlazar
con el sistema de autenticacion de Supabase, manteniendo compatibilidad con
usuarios legacy bcrypt (admin@demo.local, vitrium@demo.local).

Estrategia:
- Usuario nuevo via Supabase Auth (Google/Facebook/email) -> JWT incluye sub (UUID).
  Backend valida JWT con SUPABASE_JWT_SECRET, busca usuario por supabase_uid,
  si no existe lo crea automaticamente con rol='cliente'.
- Usuario legacy con password bcrypt -> sigue usando cookie ergon_session
  via /api/auth/login. supabase_uid queda NULL.
- Un usuario nunca tiene los dos al mismo tiempo (XOR).

Idempotente: CREATE INDEX IF NOT EXISTS + check schema antes de ALTER TABLE.
"""

import sqlite3
import sys
from pathlib import Path


def column_exists(conn: sqlite3.Connection, table: str, column: str) -> bool:
    """Verifica si una columna existe en la tabla (SQLite-specific)."""
    cur = conn.execute(f"PRAGMA table_info({table})")
    return any(row[1] == column for row in cur.fetchall())


def migrate(db_path: str | Path) -> dict:
    """
    Aplica la migracion. Retorna dict con stats:
        {ok: bool, added_column: bool, added_index: bool, msg: str}
    """
    db_path = Path(db_path)
    if not db_path.exists():
        return {"ok": False, "msg": f"DB no existe: {db_path}"}

    conn = sqlite3.connect(str(db_path))
    conn.execute("PRAGMA foreign_keys = ON")
    stats = {"ok": True, "added_column": False, "added_index": False}

    try:
        # 1. Agregar columna supabase_uid si no existe
        if not column_exists(conn, "usuarios", "supabase_uid"):
            conn.execute("ALTER TABLE usuarios ADD COLUMN supabase_uid TEXT NULL")
            stats["added_column"] = True

        # 2. Indice unique para lookups rapidos por supabase_uid
        # (UNIQUE con NULLs permite multiples NULL en SQLite)
        conn.execute("""
            CREATE UNIQUE INDEX IF NOT EXISTS idx_usuarios_supabase_uid
            ON usuarios (supabase_uid)
            WHERE supabase_uid IS NOT NULL
        """)
        stats["added_index"] = True

        conn.commit()
        stats["msg"] = "OK"
    except sqlite3.Error as e:
        conn.rollback()
        stats["ok"] = False
        stats["msg"] = f"SQL error: {e}"
    finally:
        conn.close()

    return stats


if __name__ == "__main__":
    import os
    db = os.environ.get("DATABASE_PATH", "./db/ergon.db")
    result = migrate(db)
    print(f"migrate_supabase_bridge: {result}")
    sys.exit(0 if result["ok"] else 1)
