from strategies.strategy import PathFindingStrategy


class DFSStrategy(PathFindingStrategy):

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

        frontier = [start]

        visited = {
            start.getPosition()
        }

        ancestry = {}

        explored_count = 0

        while frontier:

            current = frontier.pop()
            explored_count += 1

            if current == exit:
                break

            neighbors = maze.getNeighbors(current)

            for neighbor in reversed(neighbors):

                point = neighbor.getPosition()

                if point in visited:
                    continue

                visited.add(point)
                ancestry[point] = 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