"""Base classes for states."""

from __future__ import annotations

from typing import Protocol, TypeAlias

import attrs
import tcod.console
import tcod.event


class State(Protocol):
    """An abstract game state."""

    __slots__ = ()

    def on_event(self, event: tcod.event.Event) -> StateResult:
        """Called on events."""

    def on_draw(self, console: tcod.console.Console) -> None:
        """Called when the state is being drawn."""


@attrs.define()
class Push:
    """Push a new state on top of the stack."""

    state: State


@attrs.define()
class Pop:
    """Remove the current state from the stack."""


@attrs.define()
class Reset:
    """Replace the entire stack with a new state."""

    state: State


StateResult: TypeAlias = "Push | Pop | Reset | None"
"""Union of state results."""
