""" implement stack ADT
"""
from container import Container, EmptyContainerException
import random


class Sack(Container):
    """ A Sack with elements in no particular order.
    """

    def __init__(self) -> None:
        """ Create a new, empty Sack self.
        """
        self._storage = []

    def add(self, obj: object)-> None:
        """ Add object obj to random position of Sack self.
        """
        self._storage.append(obj)

    def remove(self) -> object:
        """ Remove and return some random element of Sack self.

        Assume Sack self is not empty.
        >>> s = Sack()
        >>> s.add(7)
        >>> s.remove()
        7
        """
        if self.is_empty():
            raise EmptyContainerException
        else:
            i = random.randint(0, len(self._storage)-1)
            return self._storage.pop(i)

    def is_empty(self) -> bool:
        """ Return whether Sack self is empty.
        >>> s = Sack()
        >>> s.is_empty()
        True
        >>> s.add(s)
        >>> s.is_empty()
        False
        """
        return len(self._storage) == 0

    def __str__(self) -> str:
        """ returns string represntation of sack
        """
        return str(self._storage)


# if __name__ == "__main__":
#     import doctest
#     doctest.testmod()
#     s = Sack()
#     s.add(3)
#     print(s)
#     s.add("a")
#     print(s)
#     s.add(4)
#     print(s)
#     s.add(5)
#     print(s)
#     s.add(6)
#     print(s)
#     print(s.is_empty())
#     print(s.remove())
#     print(s)
#     # print(s.remove())
#     print(s.is_empty())
#     # print(s.remove())
#
#         if(not self.is_empty()):
#             i = random.randint(0, len(self._storage)-1)
#             return self._storage.pop(i)
#         else:
#             return None
