from abc import ABC, abstractmethod


from source.classes import Cell, Maze


class PathFindingStrategy(ABC):
    """Интерфейс для семейства алгоритмов поиска пути от старта до выхода."""

    @abstractmethod
    def findPath(self, maze: Maze) -> tuple[list[tuple[int, int]], int]:
        """Возвращающим список координат клеток пути (от старта до выхода включительно) или пустой список, если пути нет и количество посещённых клеток."""
        pass
    @property
    @abstractmethod
    def name(self) -> str:
        """Возвращает название алгоритма"""
        pass

# class CellAlgorithm(Cell):
#     def __init__(self, x: int, y: int, parent: Cell, exitDist: float, isWall=False, isStart=False, isExit=False, value=1):
#         super().__init__(x, y, isWall, isStart, isExit, value)
#         self.parent = parent
#         self.ExitDist = exitDist
#         self.weight = self.value + exitDist


def reconstruct_path(came_from: dict, start: Cell, end: Cell) -> list[Cell]:
    """Восстановление пути по словарю предшественников"""
    path = []
    current = end
    
    # Идём от конца к началу по цепочке came_from
    while current.getXY() != start.getXY():
        path.append(current)
        current = came_from[current.getXY()]
    
    path.append(start)
    return path[::-1]