from abc import ABC, abstractmethod
from models import Cell, Player


class Command(ABC):
    
    @abstractmethod
    def execute(self) -> None:
        pass
    
    @abstractmethod
    def undo(self) -> None:
        pass


class MoveCommand(Command):
    
    def __init__(self, player: Player, new_cell: Cell):
        self._player = player
        self._new_cell = new_cell
        self._old_cell = player.current_cell
    
    def execute(self) -> None:
        self._player.move_to(self._new_cell)
    
    def undo(self) -> None:
        self._player.move_to(self._old_cell)