from collections.abc import Sequence
from typing import Optional, Union

from ..context import context
from ..events import GenericEventArguments, Handler


def on(type: str,  # pylint: disable=redefined-builtin
       handler: Optional[Handler[GenericEventArguments]] = None,
       args: Union[None, Sequence[str], Sequence[Optional[Sequence[str]]]] = None, *,
       throttle: float = 0.0,
       leading_events: bool = True,
       trailing_events: bool = True,
       ):
    """Subscribe to a global event.

    :param type: name of the event
    :param handler: callback that is called upon occurrence of the event
    :param args: arguments included in the event message sent to the event handler (default: `None` meaning all)
    :param throttle: minimum time (in seconds) between event occurrences (default: 0.0)
    :param leading_events: whether to trigger the event handler immediately upon the first event occurrence (default: `True`)
    :param trailing_events: whether to trigger the event handler after the last event occurrence (default: `True`)
    """
    context.client.layout.on(type, handler, args,
                             throttle=throttle, leading_events=leading_events, trailing_events=trailing_events)
