#!/usr/bin/env python
# coding: utf-8

# In[ ]:


from abc import ABC, abstractmethod
from typing import List, Optional
from modelsMaze import Maze
from modelsCell import Cell

class PathFindingStrategy(ABC):
    """Интерфейс стратегии поиска пути (паттерн Strategy)."""

    @abstractmethod
    def find_path(self, maze: Maze, start: Cell, exit_cell: Cell) -> List[Cell]:
        """
        Найти путь от start до exit_cell.
        Возвращает список клеток пути (включая start и exit) или пустой список.
        """
        pass

    @property
    @abstractmethod
    def name(self) -> str:
        """Имя стратегии для отчётов."""
        pass

    def _reconstruct_path(self, came_from: dict, start: Cell, current: Cell) -> List[Cell]:
        """Восстановить путь из словаря предков."""
        path = []
        while current != start:
            path.append(current)
            current = came_from.get(current)
            if current is None:
                return []
        path.append(start)
        path.reverse()
        return path

