"""Offer persistent_notifications triggered automation rules."""
from __future__ import annotations

import logging
from typing import Final

import voluptuous as vol

from homeassistant.const import CONF_PLATFORM
from homeassistant.core import CALLBACK_TYPE, HassJob, HomeAssistant, callback
import homeassistant.helpers.config_validation as cv
from homeassistant.helpers.trigger import TriggerActionType, TriggerData, TriggerInfo
from homeassistant.helpers.typing import ConfigType

from . import Notification, UpdateType, async_register_callback

_LOGGER = logging.getLogger(__name__)


CONF_NOTIFICATION_ID: Final = "notification_id"
CONF_UPDATE_TYPE: Final = "update_type"

TRIGGER_SCHEMA = cv.TRIGGER_BASE_SCHEMA.extend(
    {
        vol.Required(CONF_PLATFORM): "persistent_notification",
        vol.Optional(CONF_NOTIFICATION_ID): str,
        vol.Optional(CONF_UPDATE_TYPE): vol.All(
            cv.ensure_list, [vol.Coerce(UpdateType)]
        ),
    }
)


async def async_attach_trigger(
    hass: HomeAssistant,
    config: ConfigType,
    action: TriggerActionType,
    trigger_info: TriggerInfo,
) -> CALLBACK_TYPE:
    """Listen for state changes based on configuration."""
    trigger_data: TriggerData = trigger_info["trigger_data"]
    job = HassJob(action)

    persistent_notification_id = config.get(CONF_NOTIFICATION_ID)
    update_types = config.get(CONF_UPDATE_TYPE)

    @callback
    def persistent_notification_listener(
        update_type: UpdateType, notifications: dict[str, Notification]
    ) -> None:
        """Listen for persistent_notification updates."""

        for notification in notifications.values():
            if update_types and update_type not in update_types:
                continue
            if (
                persistent_notification_id
                and notification[CONF_NOTIFICATION_ID] != persistent_notification_id
            ):
                continue

            hass.async_run_hass_job(
                job,
                {
                    "trigger": {
                        **trigger_data,
                        "platform": "persistent_notification",
                        "update_type": update_type,
                        "notification": notification,
                    }
                },
            )

    _LOGGER.debug(
        "Attaching persistent_notification trigger for ID: '%s', update_types: %s",
        persistent_notification_id,
        update_types,
    )

    return async_register_callback(hass, persistent_notification_listener)