from collections import deque
from strategies.strategy import PathFindingStrategy


class BFSStrategy(PathFindingStrategy):

    def findPath(self, maze, start, exit):

        frontier = deque([start])

        visited = {
            start.getPosition()
        }

        ancestry = {}

        explored_count = 0

        while frontier:

            current = frontier.popleft()
            explored_count += 1

            if current == exit:
                break

            for neighbor in maze.getNeighbors(current):

                mark = neighbor.getPosition()

                if mark in visited:
                    continue

                visited.add(mark)
                ancestry[mark] = current
                frontier.append(neighbor)

        if exit.getPosition() not in visited:
            return [], explored_count

        route = []
        cursor = exit

        while cursor != start:
            route.append(cursor)
            cursor = ancestry[cursor.getPosition()]

        route.append(start)
        route.reverse()

        return route, explored_count