from Maze import Cell, Maze
from strategy import PathFindingStrategy


class AStarStrategy(PathFindingStrategy):
    def findPath(self, maze, start, exit):

        def heuristik(cell):
            return abs(cell.x - exit.x) + abs(cell.y - exit.y)

        parents = {start: None}

        queue = [start]

        if not start or not exit:
            return [], 0

        while len(queue) != 0:
            best_cell = queue[0]
            for cell in queue:
                if heuristik(cell) < heuristik(best_cell):
                    best_cell = cell

            u = best_cell
            queue.remove(u)

            if u == exit:
                path = []
                current = exit
                while current is not None:
                    path.append(current)
                    current = parents[current]
                path.reverse()
                return path, len(parents)

            childs = maze.getNeighbors(u)
            for child in childs:
                if child not in parents:
                    parents[child] = u
                    queue.append(child)
        return [], len(parents)
