import heapq
from strategies.pathfinding_strategy import PathFindingStrategy


class DijkstraStrategy(PathFindingStrategy):
    name = "Dijkstra"

    def findPath(self, maze, start, exitCell):
        self.visitedCount = 0
        if start is None or exitCell is None:
            return []

        pq = [(0, start.x, start.y, start)]
        dist = {(start.x, start.y): 0}
        parent = {}
        closed = set()

        while pq:
            current_cost, _, _, current = heapq.heappop(pq)
            pos = (current.x, current.y)

            if pos in closed:
                continue

            closed.add(pos)
            self.visitedCount += 1

            if current.x == exitCell.x and current.y == exitCell.y:
                return self._restore_path(parent, start, exitCell)

            for neighbor in maze.getNeighbors(current):
                npos = (neighbor.x, neighbor.y)
                step_cost = getattr(neighbor, "weight", 1)
                new_cost = current_cost + step_cost

                if new_cost < dist.get(npos, float("inf")):
                    dist[npos] = new_cost
                    parent[npos] = current
                    heapq.heappush(pq, (new_cost, neighbor.x, neighbor.y, neighbor))

        return []
