"""Collection of helper methods.

All containing methods are legacy helpers that should not be used by new
components. Instead call the service directly.
"""

from homeassistant.components.group import (
    ATTR_ADD_ENTITIES,
    ATTR_ENTITIES,
    ATTR_OBJECT_ID,
    DOMAIN,
    SERVICE_REMOVE,
    SERVICE_SET,
)
from homeassistant.const import ATTR_ICON, ATTR_NAME, SERVICE_RELOAD
from homeassistant.core import HomeAssistant, callback
from homeassistant.loader import bind_hass


@bind_hass
def reload(hass: HomeAssistant) -> None:
    """Reload the automation from config."""
    hass.add_job(async_reload, hass)


@callback
@bind_hass
def async_reload(hass: HomeAssistant) -> None:
    """Reload the automation from config."""
    hass.async_create_task(hass.services.async_call(DOMAIN, SERVICE_RELOAD))


@bind_hass
def set_group(
    hass: HomeAssistant,
    object_id: str,
    name: str | None = None,
    entity_ids: list[str] | None = None,
    icon: str | None = None,
    add: list[str] | None = None,
) -> None:
    """Create/Update a group."""
    hass.add_job(
        async_set_group,
        hass,
        object_id,
        name,
        entity_ids,
        icon,
        add,
    )


@callback
@bind_hass
def async_set_group(
    hass: HomeAssistant,
    object_id: str,
    name: str | None = None,
    entity_ids: list[str] | None = None,
    icon: str | None = None,
    add: list[str] | None = None,
) -> None:
    """Create/Update a group."""
    data = {
        key: value
        for key, value in (
            (ATTR_OBJECT_ID, object_id),
            (ATTR_NAME, name),
            (ATTR_ENTITIES, entity_ids),
            (ATTR_ICON, icon),
            (ATTR_ADD_ENTITIES, add),
        )
        if value is not None
    }

    hass.async_create_task(hass.services.async_call(DOMAIN, SERVICE_SET, data))


@callback
@bind_hass
def async_remove(hass: HomeAssistant, object_id: str) -> None:
    """Remove a user group."""
    data = {ATTR_OBJECT_ID: object_id}
    hass.async_create_task(hass.services.async_call(DOMAIN, SERVICE_REMOVE, data))