"""Provide configuration end points for scripts."""

from __future__ import annotations

from typing import Any

from homeassistant.components.script import DOMAIN as SCRIPT_DOMAIN
from homeassistant.components.script.config import async_validate_config_item
from homeassistant.config import SCRIPT_CONFIG_PATH
from homeassistant.const import SERVICE_RELOAD
from homeassistant.core import HomeAssistant, callback
from homeassistant.helpers import config_validation as cv, entity_registry as er

from .const import ACTION_DELETE
from .view import EditKeyBasedConfigView


@callback
def async_setup(hass: HomeAssistant) -> bool:
    """Set up the script config API."""

    async def hook(action: str, config_key: str) -> None:
        """post_write_hook for Config View that reloads scripts."""
        if action != ACTION_DELETE:
            await hass.services.async_call(SCRIPT_DOMAIN, SERVICE_RELOAD)
            return

        ent_reg = er.async_get(hass)

        entity_id = ent_reg.async_get_entity_id(
            SCRIPT_DOMAIN, SCRIPT_DOMAIN, config_key
        )

        if entity_id is None:
            return

        ent_reg.async_remove(entity_id)

    hass.http.register_view(
        EditScriptConfigView(
            SCRIPT_DOMAIN,
            "config",
            SCRIPT_CONFIG_PATH,
            cv.slug,
            post_write_hook=hook,
            data_validator=async_validate_config_item,
        )
    )
    return True


class EditScriptConfigView(EditKeyBasedConfigView):
    """Edit script config."""

    def _write_value(
        self,
        hass: HomeAssistant,
        data: dict[str, dict[str, Any]],
        config_key: str,
        new_value: dict[str, Any],
    ) -> None:
        """Set value."""
        data[config_key] = new_value