from uuid import UUID

from psycopg import Connection
from src.__types.index import CountedList, Tenant, User
from src.infrastructure.repositories.user_repository import UserRepository


class UserQueryUseCase:
    def __init__(self, user_repository: UserRepository) -> None:
        self.user_repository = user_repository

    @classmethod
    def create(cls, tenant: Tenant, connection: Connection) -> "UserQueryUseCase":
        return UserQueryUseCase(
            user_repository=UserRepository(tenant=tenant, connection=connection),
        )

    def list_all(self) -> "list[User]":
        """全てのUserのリストを取得する。"""
        return self.user_repository.find_all()

    def list(self, page: int, page_size: int) -> CountedList[User]:
        """指定されたページのUserのリストを取得する。"""
        total = self.user_repository.count()
        users = self.user_repository.find(
            limit=page_size,
            offset=(page - 1) * page_size,
        )
        return CountedList(total=total, items=users)

    def get(self, user_id: UUID) -> User:
        """一意のUserを取得する。"""
        return self.user_repository.get(user_id)
