from core.cell import Cell


class Maze:
    def __init__(self, cells_map, start_cell=None, exit_cell=None):
        self.cells = cells_map
        self.start = start_cell
        self.exit = exit_cell

        self.height = len(cells_map)
        self.width = len(cells_map[0]) if self.height else 0

    def getCell(self, x: int, y: int):
        if y < 0 or y >= self.height:
            return None

        if x < 0 or x >= self.width:
            return None

        return self.cells[y][x]

    def getNeighbors(self, current: Cell):
        reachable = []

        top = self.getCell(current.x, current.y - 1)
        right = self.getCell(current.x + 1, current.y)
        bottom = self.getCell(current.x, current.y + 1)
        left = self.getCell(current.x - 1, current.y)

        for candidate in (top, right, bottom, left):
            if candidate is None:
                continue

            if candidate.isPassable():
                reachable.append(candidate)

        return reachable

    def hasStart(self):
        return self.start is not None

    def hasExit(self):
        return self.exit is not None

    def size(self):
        return self.width, self.height

    def __str__(self):
        rows = []

        for line in self.cells:
            visual = ""

            for cell in line:
                visual += str(cell)

            rows.append(visual)

        return "\n".join(rows)