from typing import Any

from sqlalchemy.ext.asyncio import AsyncSession, async_sessionmaker

from src.repository.auth import AuthRepo
from src.repository.tasks import TasksRepo
from src.repository.users import UsersRepo


class DBManager:
    def __init__(self, session_factory: async_sessionmaker[AsyncSession]):
        self.session_factory = session_factory

    async def __aenter__(self) -> "DBManager":
        self.session: AsyncSession = self.session_factory()
        self.user = UsersRepo(self.session)
        self.task = TasksRepo(self.session)
        self.auth = AuthRepo(self.session)
        return self

    async def __aexit__(self, exc_type: Any, exc_val: Any, exc_tb: Any) -> None:
        await self.session.rollback()
        await self.session.close()

    async def commit(self) -> None:
        await self.session.commit()
