import sys
import os

sys.path.insert(0, os.path.dirname(os.path.abspath(__file__)))

from builders.text_file_maze_builder import TextFileMazeBuilder
from strategies.bfs_strategy import BFSStrategy
from strategies.dfs_strategy import DFSStrategy
from strategies.astar_strategy import AStarStrategy
from solver.maze_solver import MazeSolver
from observer.console_view import ConsoleView

PROJECT_ROOT = os.path.dirname(os.path.abspath(__file__))
MAZES_DIR = os.path.join(PROJECT_ROOT, "mazes")

mazes = {
    "1": "small.txt",
    "2": "medium.txt",
    "3": "large.txt",
    "4": "no_exit.txt"
}

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

print("Choose maze:")
print("1 - small")
print("2 - medium")
print("3 - large")
print("4 - no_exit")
maze_choice = input("> ").strip()

while maze_choice not in mazes:
    print("Invalid choice. Try again.")
    maze_choice = input("> ").strip()

print("\nChoose strategy:")
print("1 - BFS")
print("2 - DFS")
print("3 - A*")
strategy_choice = input("> ").strip()

while strategy_choice not in strategies:
    print("Invalid choice. Try again.")
    strategy_choice = input("> ").strip()

builder = TextFileMazeBuilder()
maze_path = os.path.join(MAZES_DIR, mazes[maze_choice])
maze = builder.build_from_file(maze_path)
strategy = strategies[strategy_choice]

solver = MazeSolver(maze, strategy)
view = ConsoleView(maze)
solver.attach(view)
stats = solver.solve(mazes[maze_choice])

print(stats)