import sys
from maze_builder import TextFileMazeBuilder
from pathfinding_strategies import BFSStrategy, DFSStrategy, AStarStrategy
from maze_solver import MazeSolver
from visualization import ConsoleView, GameController, EventType
from experiments import ExperimentRunner, print_analysis
from analysis import plot_results

def create_sample_maze():
    sample_maze = [
        "S   ##### ",
        "#   # ### ",
        "# # #   # ",
        "# # ### # ",
        "#   #   # ",
        "### # ### ",
        "#   #   # ",
        "# ####### ",
        "#       E ",
        "##########"
    ]

    filename = "sample_maze.txt"
    with open(filename, 'w', encoding='utf-8') as f:
        f.write('\n'.join(sample_maze))

    return filename


def interactive_mode():


    builder = TextFileMazeBuilder()
    filename = create_sample_maze()

    try:
        maze = builder.build_from_file(filename)
        print(f"Лабиринт загружен: {maze.width}x{maze.height}")
    except Exception as e:
        print(f"Ошибка загрузки: {e}")
        return

    view = ConsoleView()
    controller = GameController(maze, view)

    strategies = {
        '1': BFSStrategy(),
        '2': DFSStrategy(),
        '3': AStarStrategy(),
    }

    print("\nДоступные алгоритмы поиска пути:")
    print("  1. BFS (поиск в ширину) - кратчайший путь")
    print("  2. DFS (поиск в глубину) - быстрый, не оптимальный")
    print("  3. A* - оптимальный с эвристикой")

    # Выбор стратегии
    while True:
        choice = input("\nВыберите алгоритм (1-3): ").strip()
        if choice in strategies:
            strategy = strategies[choice]
            break
        print("Неверный выбор. Попробуйте снова.")

    # Поиск пути
    print(f"\nИспользуем: {strategy.name}")
    print("Поиск пути...")

    solver = MazeSolver(maze, strategy)
    stats = solver.solve()

    if stats.path_found:
        print(f" Путь найден! Победа! Длина: {stats.path_length} шагов")
        print(f"  Время: {stats.time_ms:.3f} мс")

        path = strategy.find_path(maze, maze.start, maze.exit)
        controller.set_path(path)

        # Интерактивное управление
        print("\nДемонстрация паттерна Command:")
        print("  Используйте W/A/S/D для перемещения")
        print("  Нажмите U для отмены последнего хода")
        print("  Нажмите Q для выхода")
        print("\nТочка '.' показывает найденный путь")
        print("Буква 'P' показывает текущую позицию игрока")

        controller._render()

        while True:
            key = input("\n> ").lower()
            if key == 'q':
                break
            elif key == 'w':
                from visualization import Direction
                controller.move(Direction.UP)
            elif key == 's':
                from visualization import Direction
                controller.move(Direction.DOWN)
            elif key == 'a':
                from visualization import Direction
                controller.move(Direction.LEFT)
            elif key == 'd':
                from visualization import Direction
                controller.move(Direction.RIGHT)
            elif key == 'u':
                controller.undo()
                print("Ход отменён!")
            else:
                print("Команды: W(вверх), S(вниз), A(влево), D(вправо), U(отмена), Q(выход)")
    else:
        print("Путь не найден, грустно")


def experimental_mode():
    print("эксперименты")
    print("Запуск экспериментов на лабиринтах разной сложности...")

    runner = ExperimentRunner()
    results = runner.run_all_experiments()
    print_analysis(results)

    #графики
    plot_results(results)


def main():


    print("\nВыберите режим работы:")
    print("  1. Интерактивный режим (с визуализацией)")
    print("  2. Экспериментальный режим (замеры производительности)")
    print("  3. Выход")

    choice = input("\nВаш выбор (1-3): ").strip()

    if choice == '1':
        interactive_mode()
    elif choice == '2':
        experimental_mode()
    else:
        print("Adios!")
        sys.exit(0)


if __name__ == "__main__":
    main()