import sys
import os

# Добавляем корневую папку в путь поиска
sys.path.insert(0, r'C:\ivantsovma\docs\MazeProject')

from builders import TextFileMazeBuilder
from strategies import BFSStrategy, DFSStrategy, AStarStrategy

def test_strategies():
    print("ТЕСТИРОВАНИЕ STRATEGY ПАТТЕРНА")
    
    # Загружаем лабиринт
    builder = TextFileMazeBuilder()
    maze = builder.build_from_file("mazes/small_maze.txt")
    
    print(f"\nЛабиринт: {maze.width}x{maze.height}")
    print(f"Старт: ({maze.start.x}, {maze.start.y})")
    print(f"Выход: ({maze.exit.x}, {maze.exit.y})")
    
    # Создаем стратегии
    strategies = [
        BFSStrategy(),
        DFSStrategy(),
        AStarStrategy()
    ]
    
    print("РЕЗУЛЬТАТЫ ПОИСКА ПУТИ")
    
    for strategy in strategies:
        print(f"\n--- {strategy.name} ---")
        
        # Ищем путь
        path = strategy.find_path(maze, maze.start, maze.exit)
        
        if path:
            print(f"Путь найден!")
            print(f"Посещено клеток: {strategy.visited_count}")
            print(f"Длина пути: {len(path)} шагов")
            print(f"Путь: ", end="")
            for i, cell in enumerate(path[:5]):
                print(f"({cell.x},{cell.y})", end="")
                if i < len(path[:5]) - 1:
                    print(" → ", end="")
            if len(path) > 5:
                print(f" ... → ({path[-1].x},{path[-1].y})")
            else:
                print()
        else:
            print(f"Путь не найден!")
    
    # Визуализация
    print("ВИЗУАЛИЗАЦИЯ ЛАБИРИНТА С ПУТЕМ (BFS)")
    
    # Находим путь BFS
    bfs = BFSStrategy()
    path = bfs.find_path(maze, maze.start, maze.exit)
    path_set = set(path)
    
    print("\n  " + " " * 4 + "0 1 2 3 4 5 6")
    for y in range(maze.height):
        line = f"  {y} │ "
        for x in range(maze.width):
            cell = maze.get_cell(x, y)
            if cell in path_set and cell != maze.start and cell != maze.exit:
                line += "● "
            elif cell == maze.start:
                line += "S "
            elif cell == maze.exit:
                line += "E "
            elif cell.is_wall:
                line += "# "
            else:
                line += "· "
        print(line)
    
    print("\n  Условные обозначения:")
    print("    # - стена")
    print("    · - проход")
    print("    ● - путь")
    print("    S - старт")
    print("    E - выход")

def test_simple_maze():
    print("ТЕСТ НА ПРОСТОМ ЛАБИРИНТЕ")
    
    builder = TextFileMazeBuilder()
    maze = builder.build_from_file("mazes/simple_maze.txt")
    
    print(f"\nЛабиринт 5x3:")
    for y in range(maze.height):
        line = ""
        for x in range(maze.width):
            cell = maze.get_cell(x, y)
            if cell.is_wall:
                line += "#"
            elif cell.is_start:
                line += "S"
            elif cell.is_exit:
                line += "E"
            else:
                line += " "
        print(f"  {line}")
    
    strategies = [BFSStrategy(), DFSStrategy(), AStarStrategy()]
    
    for strategy in strategies:
        path = strategy.find_path(maze, maze.start, maze.exit)
        if path:
            print(f"\n  {strategy.name}: путь найден за {len(path)} шагов")
        else:
            print(f"\n  {strategy.name}: путь НЕ найден")

if __name__ == "__main__":
    test_strategies()
    test_simple_maze()
    print("ТЕСТИРОВАНИЕ ЗАВЕРШЕНО")