"""Button platform for Kiosker."""

from collections.abc import Callable
from dataclasses import dataclass
from typing import override

from kiosker import KioskerAPI

from homeassistant.components.button import ButtonEntity, ButtonEntityDescription
from homeassistant.const import EntityCategory
from homeassistant.core import HomeAssistant
from homeassistant.helpers.entity_platform import AddConfigEntryEntitiesCallback

from . import KioskerConfigEntry
from .entity import KioskerEntity

PARALLEL_UPDATES = 1


@dataclass(frozen=True, kw_only=True)
class KioskerButtonEntityDescription(ButtonEntityDescription):
    """Describe a Kiosker button."""

    action_fn: Callable[[KioskerAPI], None] | None = None


BUTTONS: tuple[KioskerButtonEntityDescription, ...] = (
    KioskerButtonEntityDescription(
        key="ping",
        translation_key="ping",
        entity_category=EntityCategory.DIAGNOSTIC,
        action_fn=lambda api: api.ping(),
    ),
    KioskerButtonEntityDescription(
        key="navigateRefresh",
        translation_key="navigate_refresh",
        action_fn=lambda api: api.navigate_refresh(),
    ),
    KioskerButtonEntityDescription(
        key="navigateHome",
        translation_key="navigate_home",
        action_fn=lambda api: api.navigate_home(),
    ),
    KioskerButtonEntityDescription(
        key="navigateForward",
        translation_key="navigate_forward",
        action_fn=lambda api: api.navigate_forward(),
    ),
    KioskerButtonEntityDescription(
        key="navigateBackward",
        translation_key="navigate_backward",
        action_fn=lambda api: api.navigate_backward(),
    ),
    KioskerButtonEntityDescription(
        key="print",
        translation_key="print",
        action_fn=lambda api: api.print(),
    ),
    KioskerButtonEntityDescription(
        key="clearCache",
        translation_key="clear_cache",
        entity_category=EntityCategory.CONFIG,
        action_fn=lambda api: api.clear_cache(),
    ),
    KioskerButtonEntityDescription(
        key="clearCookies",
        translation_key="clear_cookies",
        entity_category=EntityCategory.CONFIG,
        action_fn=lambda api: api.clear_cookies(),
    ),
    KioskerButtonEntityDescription(
        key="screensaverInteract",
        translation_key="screensaver_interact",
        action_fn=lambda api: api.screensaver_interact(),
    ),
    KioskerButtonEntityDescription(
        key="blackoutClear",
        translation_key="blackout_clear",
        action_fn=lambda api: api.blackout_clear(),
    ),
)


async def async_setup_entry(
    hass: HomeAssistant,
    entry: KioskerConfigEntry,
    async_add_entities: AddConfigEntryEntitiesCallback,
) -> None:
    """Set up Kiosker buttons based on a config entry."""
    coordinator = entry.runtime_data

    async_add_entities(
        KioskerButton(coordinator, description) for description in BUTTONS
    )


class KioskerButton(KioskerEntity, ButtonEntity):
    """Representation of a Kiosker button."""

    entity_description: KioskerButtonEntityDescription

    @override
    async def async_press(self) -> None:
        """Handle button press."""
        if action_fn := self.entity_description.action_fn:
            await self.hass.async_add_executor_job(action_fn, self.coordinator.api)
