import os
import ssl
from sqlalchemy.ext.asyncio import create_async_engine, AsyncSession
from sqlalchemy.orm import sessionmaker, declarative_base
from dotenv import load_dotenv

load_dotenv()

DB_USER = os.getenv("DB_USER", "postgres")
DB_PASSWORD = os.getenv("DB_PASSWORD", "password")
DB_HOST = os.getenv("DB_HOST", "127.0.0.1")
DB_PORT = os.getenv("DB_PORT", "5432")
DB_NAME = os.getenv("DB_NAME", "cyberrant")

BASE_DIR = os.path.dirname(os.path.abspath(__file__))

# If DATABASE_URL is explicitly set, use it (production). Otherwise, fall back to SQLite for local dev.
_explicit_url = os.getenv("DATABASE_URL")
if _explicit_url:
    DATABASE_URL = _explicit_url
    CERT_PATH = os.path.join(BASE_DIR, "..", "global-bundle.pem")
    connect_args = {}
    if os.path.exists(CERT_PATH):
        ssl_context = ssl.create_default_context(cafile=CERT_PATH)
        connect_args["ssl"] = ssl_context
    engine = create_async_engine(DATABASE_URL, connect_args=connect_args, echo=False)
else:
    # Local SQLite fallback
    _sqlite_path = os.path.join(BASE_DIR, "local_dev.db")
    DATABASE_URL = f"sqlite+aiosqlite:///{_sqlite_path}"
    engine = create_async_engine(DATABASE_URL, echo=False)
AsyncSessionLocal = sessionmaker(
    engine, class_=AsyncSession, expire_on_commit=False)
Base = declarative_base()


async def get_db():
    async with AsyncSessionLocal() as session:
        yield session
