# app/src/core/event_bus.py

from __future__ import annotations

from typing import Any


class EventBus:
    _version: int = 0
    _last_event_type: str | None = None
    _last_payload: dict[str, Any] = {}
    _events: list[tuple[int, str, dict[str, Any]]] = []
    _max_events: int = 100

    # зафиксировать важное событие системы
    @classmethod
    def emit(cls, event_type: str, payload: dict[str, Any] | None = None) -> None:
        cls._version += 1
        cls._last_event_type = event_type
        cls._last_payload = payload or {}

        cls._events.append(
            (
                cls._version,
                event_type,
                dict(cls._last_payload),
            )
        )

        if len(cls._events) > cls._max_events:
            cls._events = cls._events[-cls._max_events:]

    # текущая версия событий
    @classmethod
    def version(cls) -> int:
        return cls._version

    # последнее событие
    @classmethod
    def last_event(cls) -> tuple[str | None, dict[str, Any]]:
        return cls._last_event_type, dict(cls._last_payload)

    # события после указанной версии
    @classmethod
    def events_after(cls, version: int) -> list[tuple[int, str, dict[str, Any]]]:
        return [
            (event_version, event_type, dict(payload))
            for event_version, event_type, payload in cls._events
            if event_version > version
        ]