import os
from .observer import Observer, Event, EventType

class ConsoleView(Observer):
    """Консольное отображение лабиринта"""
    
    def __init__(self):
        self.maze = None
        self.player_pos = None
        self.path = []
        self.current_strategy = None
        self.messages = []
    
    def update(self, event: Event):
        event_type = event.event_type
        data = event.data
        
        if event_type == EventType.MAZE_LOADED:
            self.maze = data
            self._log(f"Лабиринт загружен: {self.maze.width}x{self.maze.height}")
        
        elif event_type == EventType.PATH_FOUND:
            self.path = data if data else []
            self._log(f"Путь найден! Длина: {len(self.path)} шагов")
        
        elif event_type == EventType.PATH_NOT_FOUND:
            self.path = []
            self._log(f"Путь не найден!")
        
        elif event_type == EventType.PLAYER_MOVED:
            self.player_pos = data
            self._log(f"Игрок переместился на ({data.x}, {data.y})")
        
        elif event_type == EventType.SEARCH_START:
            self._log(f"Начинаем поиск пути...")
        
        elif event_type == EventType.SEARCH_END:
            self._log(f"Поиск завершён")
        
        elif event_type == EventType.ERROR:
            self._log(f"Ошибка: {data}")
        
        elif event_type == EventType.UNDO:
            self._log(f"Отмена последнего действия")
        
        # После каждого события перерисовываем
        self.render()
    
    def render(self):
        """Отрисовывает лабиринт в консоли"""
        if not self.maze:
            print("Лабиринт не загружен")
            return
        
        # Очищаем консоль
        os.system('cls' if os.name == 'nt' else 'clear')
        
        print("=" * 60)
        print("ЛАБИРИНТ")
        if self.current_strategy:
            print(f"Алгоритм: {self.current_strategy}")
        print("=" * 60)
        
        # Создаём множество клеток пути для быстрого доступа
        path_set = set(self.path) if self.path else set()
        
        # Верхняя граница с координатами
        print("    " + " ".join(f"{x:2}" for x in range(self.maze.width)))
        
        for y in range(self.maze.height):
            # Номер строки
            line = f"{y:2} │ "
            
            for x in range(self.maze.width):
                cell = self.maze.get_cell(x, y)
                
                # Определяем символ для отображения
                if self.player_pos and cell == self.player_pos:
                    line += "🎮 "
                elif cell == self.maze.start:
                    line += "🚩 "
                elif cell == self.maze.exit:
                    line += "🏁 "
                elif cell in path_set:
                    line += "●  "
                elif cell.is_wall:
                    line += "██ "
                else:
                    line += "·  "
            
            print(line)

        print("Условные обозначения:")
        print("  ██ - стена    ·  - проход    ●  - путь")
        print("  🚩 - старт    🏁 - выход    🎮 - игрок")
        if self.current_strategy:
            print(f"  Алгоритм: {self.current_strategy}")
        
        # Выводим сообщения
        if self.messages:
            print("\nСООБЩЕНИЯ:")
            for msg in self.messages[-5:]:  # Показываем последние 5 сообщений
                print(f"  {msg}")
        print("Команды: W/A/S/D - движение, U - отмена, Q - выход")
    
    def set_strategy(self, strategy_name: str):
        """Устанавливает имя текущей стратегии для отображения"""
        self.current_strategy = strategy_name
    
    def _log(self, message: str):
        """Добавляет сообщение в лог"""
        self.messages.append(message)
        if len(self.messages) > 10:
            self.messages.pop(0)
    
    def clear_messages(self):
        """Очищает сообщения"""
        self.messages = []