import random
from typing import List

from mfg_package.environment import constants as c
from mfg_package.environment.groups.env_objects import EnvObjects
from mfg_package.environment.groups.mixins import PositionMixin
from mfg_package.environment.entity.wall_floor import Wall, Floor


class Walls(PositionMixin, EnvObjects):
    _entity = Wall
    symbol = c.SYMBOL_WALL

    def __init__(self, *args, **kwargs):
        super(Walls, self).__init__(*args, **kwargs)
        self._value = c.VALUE_OCCUPIED_CELL

    @classmethod
    def from_coordinates(cls, argwhere_coordinates, *args, **kwargs):
        tiles = cls(*args, **kwargs)
        # noinspection PyTypeChecker
        tiles.add_items([cls._entity(pos) for pos in argwhere_coordinates])
        return tiles

    @classmethod
    def from_tiles(cls, tiles, *args, **kwargs):
        raise RuntimeError()


class Floors(Walls):
    _entity = Floor
    symbol = c.SYMBOL_FLOOR
    is_blocking_light: bool = False
    can_collide: bool = False

    def __init__(self, *args, **kwargs):
        super(Floors, self).__init__(*args, **kwargs)
        self._value = c.VALUE_FREE_CELL

    @property
    def occupied_tiles(self):
        tiles = [tile for tile in self if tile.is_occupied()]
        random.shuffle(tiles)
        return tiles

    @property
    def empty_tiles(self) -> List[Floor]:
        tiles = [tile for tile in self if tile.is_empty()]
        random.shuffle(tiles)
        return tiles

    @classmethod
    def from_tiles(cls, tiles, *args, **kwargs):
        raise RuntimeError()
