import os
from pathlib import Path

from dotenv import load_dotenv
from sqlalchemy import create_engine
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy.orm import sessionmaker

load_dotenv()

# Ha a projekt mellett megtalálható a helyi SQLite adatbázisfájl, azt használjuk
# (fejlesztői / helyi környezet). Ha nincs ilyen fájl, az éles MariaDB/MySQL
# kapcsolatot építjük fel a .env-ben megadott adatok alapján.
SQLITE_PATH = Path(__file__).resolve().parent / "emelo_reg.db"

if SQLITE_PATH.exists():
    SQLALCHEMY_DATABASE_URL = f"sqlite:///{SQLITE_PATH}"
    engine = create_engine(
        SQLALCHEMY_DATABASE_URL, connect_args={"check_same_thread": False}
    )
else:
    DB_HOST = os.getenv("DB_HOST", "localhost")
    DB_PORT = os.getenv("DB_PORT", "3306")
    DB_USER = os.getenv("DB_USER")
    DB_PASSWORD = os.getenv("DB_PASSWORD")
    DB_NAME = os.getenv("DB_NAME")

    if not all([DB_USER, DB_PASSWORD, DB_NAME]):
        raise RuntimeError(
            "Nem található emelo_reg.db SQLite fájl, és a MariaDB/MySQL kapcsolati adatok "
            "(DB_USER, DB_PASSWORD, DB_NAME) sincsenek beállítva a .env fájlban!"
        )

    SQLALCHEMY_DATABASE_URL = (
        f"mysql+pymysql://{DB_USER}:{DB_PASSWORD}@{DB_HOST}:{DB_PORT}/{DB_NAME}?charset=utf8mb4"
    )
    engine = create_engine(SQLALCHEMY_DATABASE_URL, pool_pre_ping=True, pool_recycle=3600)

# A munkamenet (session) gyár, amit a main.py-ban a get_db() használ
SessionLocal = sessionmaker(autocommit=False, autoflush=False, bind=engine)

# Az alap osztály, amiből a models.py-ban lévő táblák öröklődnek
Base = declarative_base()

# Adatbázis kapcsolat megnyitása és lezárása minden kérésnél
def get_db():
    db = SessionLocal()
    try:
        yield db
    finally:
        db.close()
