class Cell:
    """
    Клетка лабиринта

    `x, y` - координаты клетки в лабиринте

    `isWall` - Является ли клетка стеной

    `isStart` - Является ли клетка стартом
    
    `isExit` - Является ли клетка выходом лабиринта
    
    `value` - Вес клетки
    """

    def __init__(self, x: int, y: int, isWall=False, isStart=False, isExit=False, value=1):
        """
        Создание клетки лабиринта

        `x` - столбец клетки в лабиринте
        `y` - строка клетки в лабиринте

        `isWall` - Является ли клетка стеной

        `isStart` - Является ли клетка стартом

        `isExit` - Является ли клетка выходом лабиринта

        `value` - Вес клетки
        """
        self.__x = x
        self.__y = y
        self.isWall  = isWall
        self.isStart = isStart
        self.isExit  = isExit
        self.__value = value
        pass

    @property
    def isPassable(self) -> bool:
        """возвращает `True` для прохода, если клетка не стена"""
        return not self.isWall
    
    @property
    def x(self) -> int:
        """Возвращает координату клетки по оси X"""
        return self.__x
    
    @property
    def y(self) -> int:
        """Возвращает координату клетки по оси Y"""
        return self.__y
    
    def getXY(self) -> tuple[int, int]:
        """Возвращает кортеж координат в формате `(x, y)`"""
        return self.__x, self.__y
    
    @property
    def value(self) -> int:
        """Возвращает вес клетки"""
        return self.__value
    
    def toStr(self) -> str:
        """
        Возвращает строчкое представление клетки

        `#` - Стена

        `S` - Начало лабиринта

        `E` - Конец лабиринта

        ` `(пробел) - свободный проход

        `<int>` - Вес клетки
        """
        if self.isWall:
            return '#'
        elif self.isStart:
            return 'S'
        elif self.isExit:
            return 'E'
        else:
            return ' '
        
    