import os
from pathlib import Path

from dotenv import load_dotenv
from sqlalchemy import create_engine
from sqlalchemy.orm import sessionmaker, declarative_base

load_dotenv(Path(__file__).resolve().parents[2] / ".env")

_db_host = os.getenv("DB_HOST", "")
_db_name = os.getenv("DB_NAME", "")

# Use SQLite only when DB_NAME is explicitly a SQLite file path.
if _db_name and (_db_name.startswith("/") or ".db" in _db_name):
    DATABASE_URL = f"sqlite:///{_db_name}"
    engine = create_engine(DATABASE_URL, connect_args={"check_same_thread": False}, echo=False)
else:
    _db_port = os.getenv("DB_PORT", "3306")
    _db_user = os.getenv("DB_USER", "root")
    _db_password = os.getenv("DB_PASSWORD", "")
    DATABASE_URL = (
        f"mysql+pymysql://{_db_user}:{_db_password}@{_db_host}:{_db_port}/{_db_name}"
    )
    engine = create_engine(DATABASE_URL, pool_pre_ping=True, echo=False)

SessionLocal = sessionmaker(autocommit=False, autoflush=False, bind=engine)
Base = declarative_base()


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