# config/db.py
from __future__ import annotations
import os
from sqlalchemy import create_engine
from sqlalchemy.orm import declarative_base, sessionmaker, scoped_session

# Reutiliza la URL armada en Config
from config.base import Config

# 1) Base declarativa compartida
Base = declarative_base()

# 2) Engine (pool razonable para Apache/mod_wsgi)
DATABASE_URL = Config.SQLALCHEMY_DATABASE_URI

engine = create_engine(
    DATABASE_URL,
    pool_pre_ping=True,
    pool_recycle=1800,  # 30 min
    pool_size=int(os.getenv("DB_POOL_SIZE", "5")),
    max_overflow=int(os.getenv("DB_MAX_OVERFLOW", "10")),
    future=True,
)

# 3) Session factory + scoped_session (thread-local)
SessionLocal = scoped_session(
    sessionmaker(bind=engine, autocommit=False, autoflush=False, future=True)
)

def get_session():
    """Devuelve una Session lista para usar; cierra/commit la hace el caller."""
    return SessionLocal()
# 4) Helper para integrar con Flask (current_app.session())

def init_db_app(app):
    """Adjunta una fábrica de sesión a la app Flask y configura teardown."""
    app.session = SessionLocal  # podrás usar current_app.session()

    @app.teardown_appcontext
    def remove_session(exc=None):
        # Cierra/remueve la sesión del contexto actual (scoped_session)
        SessionLocal.remove()

    return app