from sqlalchemy import create_engine
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy.orm import sessionmaker

from app.config import get_settings
from common_logging import get_logger

logger = get_logger(__name__)

settings = get_settings()
database_url = settings.database_url_with_schema.replace('postgresql://', 'postgresql+psycopg://')
engine = create_engine(database_url, pool_pre_ping=True, pool_size=10, max_overflow=20, echo=settings.debug)
SessionLocal = sessionmaker(autocommit=False, autoflush=False, bind=engine)
Base = declarative_base()
logger.info("database engine created")

def get_db():
    db = SessionLocal()
    try:
        yield db
    finally:
        db.close()

def init_db():
    from sqlalchemy import text
    with engine.connect() as conn:
        conn.execute(text(f'CREATE SCHEMA IF NOT EXISTS {settings.database_schema}'))
        conn.commit()
    Base.metadata.schema = settings.database_schema
    logger.info(f"database schema initialized: {settings.database_schema}")
