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

# In[ ]:


from typing import Optional
from commandsCommand import Command
from commandsPlayer import Player
from modelsMaze import Maze
from modelsCell import Cell

class MoveCommand(Command):
    """Команда перемещения игрока."""

    # Направления
    DIRECTIONS = {
        'w': (0, -1),   # вверх
        's': (0, 1),    # вниз
        'a': (-1, 0),   # влево
        'd': (1, 0),    # вправо
    }

    def __init__(self, player: Player, maze: Maze, direction: str):
        self.player = player
        self.maze = maze
        self.direction = direction.lower()
        self._target_cell: Optional[Cell] = None
        self._executed = False

    def execute(self) -> bool:
        """Выполнить перемещение."""
        if self.direction not in self.DIRECTIONS:
            return False

        dx, dy = self.DIRECTIONS[self.direction]
        x = self.player.current_cell.x + dx
        y = self.player.current_cell.y + dy

        self._target_cell = self.maze.get_cell(x, y)

        if self._target_cell and self._target_cell.is_passable():
            self.player.move_to(self._target_cell)
            self._executed = True
            return True

        return False

    def undo(self) -> bool:
        """Отменить перемещение."""
        if self._executed:
            success = self.player.undo_move()
            if success:
                self._executed = False
                return True
        return False

