"""Scene registry.

Each scene type registers a handler ``(page, scene_cfg) -> None`` via the
``@register("type")`` decorator. Import the per-scene modules at the bottom so
their decorators fire at package import time.
"""
from __future__ import annotations

from typing import Callable

SceneHandler = Callable[[object, dict], None]

_REGISTRY: dict[str, SceneHandler] = {}


def register(type_name: str):
    def decorator(handler: SceneHandler) -> SceneHandler:
        _REGISTRY[type_name] = handler
        return handler
    return decorator


def get_handler(type_name: str) -> SceneHandler | None:
    return _REGISTRY.get(type_name)


def known_types() -> list[str]:
    return sorted(_REGISTRY.keys())


# Auto-discover every non-underscore module in this package so its
# @register decorators fire at import time. Adding a new scene only
# requires dropping a `scenes/<type>.py` file — no edits here.
import importlib as _importlib
import pkgutil as _pkgutil

for _, _name, _ in _pkgutil.iter_modules(__path__):
    if not _name.startswith("_"):
        _importlib.import_module(f"{__name__}.{_name}")
