#!/usr/bin/env python
# coding: utf-8

# In[ ]:


import os
from typing import List, Optional, Set
from modelsMaze import Maze
from modelsCell import Cell
from visualizationObserver import Observer

class ConsoleView(Observer):
    """Консольная визуализация лабиринта."""

    # Символы для отображения
    SYMBOLS = {
        'wall': '█',
        'path': '·',
        'start': 'S',
        'exit': 'E',
        'player': 'P',
        'solution': '★'
    }

    def __init__(self, maze: Maze):
        self.maze = maze
        self.player_pos: Optional[Cell] = None
        self.solution_path: Set[Cell] = set()
        self.messages: List[str] = []

    def update(self, event: str) -> None:
        """Обработка событий от MazeSolver."""
        self.messages.append(f"[СОБЫТИЕ] {event}")
        self.render()

    def set_solution_path(self, path: List[Cell]) -> None:
        """Установить найденный путь для отображения."""
        self.solution_path = set(path)

    def set_player_position(self, cell: Cell) -> None:
        """Установить позицию игрока."""
        self.player_pos = cell

    def render(self) -> None:
        """Отрисовать лабиринт в консоли."""
        # Очистка консоли (опционально)
        # os.system('cls' if os.name == 'nt' else 'clear')

        print("\n" + "=" * (self.maze.width * 2 + 4))
        print(f"Лабиринт {self.maze.width}×{self.maze.height}")
        print("=" * (self.maze.width * 2 + 4))

        for y in range(self.maze.height):
            row = ""
            for x in range(self.maze.width):
                cell = self.maze.get_cell(x, y)
                if not cell:
                    row += "  "
                    continue

                if self.player_pos and cell == self.player_pos:
                    row += self.SYMBOLS['player'] + " "
                elif cell.is_start:
                    row += self.SYMBOLS['start'] + " "
                elif cell.is_exit:
                    row += self.SYMBOLS['exit'] + " "
                elif cell in self.solution_path:
                    row += self.SYMBOLS['solution'] + " "
                elif cell.is_wall:
                    row += self.SYMBOLS['wall'] * 2
                else:
                    row += self.SYMBOLS['path'] * 2
            print(row)

        print("-" * (self.maze.width * 2 + 4))

        # Показать последние сообщения
        if self.messages:
            print("Последние события:")
            for msg in self.messages[-3:]:
                print(f"  {msg}")

        print()

    def clear_messages(self) -> None:
        """Очистить сообщения."""
        self.messages.clear()

