from sqlalchemy.engine import URL
from typing import AsyncGenerator
from src.utils.config import Config
from sqlalchemy.orm import declarative_base
from sqlalchemy.ext.asyncio import (
    create_async_engine,
    async_sessionmaker,
    AsyncSession,
)

config = Config().config('dataLake')

DB_USER = config.get('user')
DB_PASSWORD = config.get('password')
DB_HOST = config.get('host')
DB_PORT = config.get('port')
DB_NAME = config.get('database')

missing = [
    k
    for k, v in {
        "DATALAKE_USER": DB_USER,
        "DATALAKE_PASSWORD": DB_PASSWORD,
        "DATALAKE_HOST": DB_HOST,
        "DATALAKE_PORT": DB_PORT,
        "DATALAKE_DATABASE": DB_NAME,
    }.items()
    if not v
]

if missing:
    raise RuntimeError(
        "Variáveis de ambiente ausentes para MySQL: "
        f"{', '.join(missing)}"
    )

ASYNC_DATABASE_URL = URL.create(
    drivername="mysql+asyncmy",
    username=DB_USER,
    password=DB_PASSWORD,
    host=DB_HOST,
    port=int(DB_PORT),
    database=DB_NAME,
)

async_engine = create_async_engine(
    ASYNC_DATABASE_URL,
    pool_size=10,
    max_overflow=5,
    pool_pre_ping=True,
    pool_recycle=1800,
    connect_args={"charset": "utf8mb4", "autocommit": False},
)

Base = declarative_base()

AsyncSessionLocal = async_sessionmaker(
    bind=async_engine,
    class_=AsyncSession,
    expire_on_commit=False,
    autoflush=False,
    autocommit=False,
)


async def get_db() -> AsyncGenerator[AsyncSession, None]:
    async with AsyncSessionLocal() as session:
        yield session
