from typing import Union, List, Tuple, Dict

from marl_factory_grid.environment.groups.collection import Collection
from .entities import Maintainer
from ..machines import constants as mc
from ..machines.actions import MachineAction


class Maintainers(Collection):
    _entity = Maintainer

    @property
    def var_can_collide(self):
        return True

    @property
    def var_can_move(self):
        return True

    @property
    def var_is_blocking_light(self):
        return False

    @property
    def var_has_position(self):
        return True

    def __init__(self, *args, **kwargs):
        """
        A collection of maintainers that is used to spawn them.
        """
        super().__init__(*args, **kwargs)

    def spawn(self, coords_or_quantity: Union[int, List[Tuple[(int, int)]]], *entity_args):
        self.add_items([self._entity(mc.MACHINES, MachineAction(), pos) for pos in coords_or_quantity])