from typing import Generic, List, TypeVar

T = TypeVar("T")


class Bucket(Generic[T]):
    def __init__(self, size: int) -> None:
        self.size = size
        # fixme: Criar uma interface comum para as *Message
        # para substituir esse Any
        self._items: List[T] = []

    def is_full(self) -> bool:
        return len(self._items) == self.size

    def is_empty(self) -> bool:
        return len(self._items) == 0

    def put(self, item: T):
        if self.is_full():
            error_msg = f"Bucket is at full capacity: {self.size}"
            raise BucketFullException(error_msg)
        self._items.append(item)

    def pop_all(self) -> List[T]:
        _r = self._items
        self._items = []
        return _r

    @property
    def used(self) -> int:
        return len(self._items)


class BucketFullException(Exception):
    pass
