"""Helpers for hass dispatcher & internal component / platform."""

from homeassistant.core import callback

DATA_DISPATCHER = 'dispatcher'


def dispatcher_connect(hass, signal, target):
    """Connect a callable function to a singal."""
    hass.add_job(async_dispatcher_connect, hass, signal, target)


@callback
def async_dispatcher_connect(hass, signal, target):
    """Connect a callable function to a singal.

    This method must be run in the event loop.
    """
    if DATA_DISPATCHER not in hass.data:
        hass.data[DATA_DISPATCHER] = {}

    if signal not in hass.data[DATA_DISPATCHER]:
        hass.data[DATA_DISPATCHER][signal] = []

    hass.data[DATA_DISPATCHER][signal].append(target)


def dispatcher_send(hass, signal, *args):
    """Send signal and data."""
    hass.add_job(async_dispatcher_send, hass, signal, *args)


@callback
def async_dispatcher_send(hass, signal, *args):
    """Send signal and data.

    This method must be run in the event loop.
    """
    target_list = hass.data.get(DATA_DISPATCHER, {}).get(signal, [])

    for target in target_list:
        hass.async_add_job(target, *args)