import sys
sys.path.insert(0, "/var/www/html/metafoliadorv2")

from contextvars import ContextVar
from sqlalchemy import create_engine, event
from sqlalchemy.orm import sessionmaker, DeclarativeBase

from app.config import settings


def _set_session_utc(dbapi_conn, _record):
    cur = dbapi_conn.cursor()
    try:
        cur.execute("SET TIMEZONE TO 'UTC'")
    finally:
        cur.close()


engine = create_engine(settings.database_url)
event.listen(engine, "connect", _set_session_utc)
SessionLocal = sessionmaker(autocommit=False, autoflush=False, bind=engine)

tenant_db_url_ctx: ContextVar[str | None] = ContextVar("tenant_db_url", default=None)

_tenant_engines: dict[str, any] = {}
_tenant_sessions: dict[str, any] = {}


class Base(DeclarativeBase):
    pass


def _get_tenant_engine(tenant_url: str):
    if tenant_url not in _tenant_engines:
        engine_t = create_engine(tenant_url)
        event.listen(engine_t, "connect", _set_session_utc)
        _tenant_engines[tenant_url] = engine_t
        _tenant_sessions[tenant_url] = sessionmaker(autocommit=False, autoflush=False, bind=engine_t)
    return _tenant_engines[tenant_url]


def get_db():
    tenant_url = tenant_db_url_ctx.get()
    if tenant_url:
        _get_tenant_engine(tenant_url)
        db = _tenant_sessions[tenant_url]()
    else:
        db = SessionLocal()
    try:
        yield db
    finally:
        db.close()


def get_tenant_session():
    """Crea una sesión de BD respetando el contexto multitenant (útil fuera de dependencias FastAPI)."""
    tenant_url = tenant_db_url_ctx.get()
    if tenant_url:
        _get_tenant_engine(tenant_url)
        return _tenant_sessions[tenant_url]()
    return SessionLocal()
