import sys
import os

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

from builders import TextFileMazeBuilder
from strategies import BFSStrategy
from visualization.observer import Event, EventType
from visualization.console_view import ConsoleView
from visualization.game_controller import GameController

def play_maze():
    print("НАЙДИ ВЫХОД ИЗ ЛАБИРИНТА")
    
    #Загружаем лабиринт
    builder = TextFileMazeBuilder()
    
    #Выбор лабиринта
    print("\nВыберите лабиринт:")
    print("1. Простой лабиринт (simple_maze.txt)")
    print("2. Сложный лабиринт (small_maze.txt)")
    
    choice = input("Ваш выбор (1/2): ").strip()
    
    if choice == "1":
        maze_file = "mazes/simple_maze.txt"
    else:
        maze_file = "mazes/small_maze.txt"
    
    try:
        maze = builder.build_from_file(maze_file)
    except Exception as e:
        print(f"Ошибка загрузки лабиринта: {e}")
        return
    
    #Создаём контроллер и отображение
    controller = GameController(maze)
    view = ConsoleView()
    
    #Подписываем view на события контроллера
    controller.attach(view)
    
    #Уведомляем о загрузке лабиринта
    controller.notify(Event(EventType.MAZE_LOADED, maze))
    
    #Находим и показываем оптимальный путь (для подсказки)
    bfs = BFSStrategy()
    optimal_path = bfs.find_path(maze, maze.start, maze.exit)
    controller.notify(Event(EventType.PATH_FOUND, optimal_path))
    
    print("\nУправление:")
    print("  w - вверх    s - вниз    a - влево    d - вправо")
    print("  u - отменить    q - выход")
    
    # Игровой цикл
    while True:
        view.render()
        
        # Проверка победы
        if controller.get_player_position() == maze.exit:
            view.render()
            print("\nВЫ НАШЛИ ВЫХОД!")
            break
        
        # Чтение команды
        cmd = input("\nВведите команду: ").lower().strip()
        
        if cmd == 'q':
            print("Выход из игры...")
            break
        elif cmd == 'u':
            controller.undo()
        elif cmd == 'w':
            controller.move((0, -1))
        elif cmd == 's':
            controller.move((0, 1))
        elif cmd == 'a':
            controller.move((-1, 0))
        elif cmd == 'd':
            controller.move((1, 0))
        else:
            print("Неизвестная команда! Используйте w/a/s/d, u или q")

if __name__ == "__main__":
    try:
        play_maze()
    except KeyboardInterrupt:
        print("\n\nИгра прервана пользователем")
    except Exception as e:
        print(f"\nОшибка: {e}")
        import traceback
        traceback.print_exc()