"""
Создать интерфейс Observer с методом update(event),
где event может быть строкой или объектом с типом события ("path_found", "move", "maze_loaded").
"""

from enum import Enum
from abc import ABC, abstractmethod

class MazeEventType(Enum):
    PATH_FOUND = "path_found"
    MOVE = "move"
    MAZE_LOADED = "maze_loaded"

class MazeEvent:
    data=None
    def __init__(self, evtype: MazeEventType, data=None):
        if not isinstance(evtype, MazeEventType):
            raise TypeError(f"evtype must be an EventType, got {type(evtype)}")
        self.evtype = evtype
        self.data = data

class Observer(ABC):
    @abstractmethod
    def update(self, event: MazeEvent):
        raise NotImplementedError


class Subject(ABC):
    """Издатель: управляет подписчиками и отправляет им уведомления."""
    def __init__(self):
        self._observers:set[Observer] = set()
    
    def attach(self, obs:Observer):
        "Подписать наблюдателя"
        self._observers.add(obs)
    
    def detach(self, obs:Observer):
        "Отписать наблюдателя"
        self._observers.discard(obs)
    
    def notify(self, event:MazeEvent):
        for obs in self._observers:
            obs.update(event)