import time
from dataclasses import dataclass, field
from typing import List
from maze import Maze, Cell
from strategies import PathFindingStrategy

@dataclass
class SearchStats:
    time_ms: float
    visited_cells: int
    path_length: int
    path: List[Cell] = field(default_factory=list)

class MazeSolver:
    def __init__(self, maze: Maze, strategy: PathFindingStrategy):
        self.maze = maze
        self.strategy = strategy

    def set_strategy(self, strategy: PathFindingStrategy):
        self.strategy = strategy

    def solve(self) -> SearchStats:
        start_time = time.perf_counter()
        path, visited = self.strategy.find_path(self.maze, self.maze.start, self.maze.exit)
        end_time = time.perf_counter()
        time_ms = (end_time - start_time) * 1000
        return SearchStats(time_ms=time_ms, visited_cells=visited,
                           path_length=len(path), path=path)