"""Casper Glow integration button platform."""

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

from pycasperglow import CasperGlow

from homeassistant.components.button import ButtonEntity, ButtonEntityDescription
from homeassistant.core import HomeAssistant
from homeassistant.helpers.device_registry import format_mac
from homeassistant.helpers.entity_platform import AddConfigEntryEntitiesCallback

from .coordinator import CasperGlowConfigEntry, CasperGlowCoordinator
from .entity import CasperGlowEntity

PARALLEL_UPDATES = 1


@dataclass(frozen=True, kw_only=True)
class CasperGlowButtonEntityDescription(ButtonEntityDescription):
    """Describe a Casper Glow button entity."""

    press_fn: Callable[[CasperGlow], Awaitable[None]]


BUTTON_DESCRIPTIONS: tuple[CasperGlowButtonEntityDescription, ...] = (
    CasperGlowButtonEntityDescription(
        key="pause",
        translation_key="pause",
        press_fn=lambda device: device.pause(),
    ),
    CasperGlowButtonEntityDescription(
        key="resume",
        translation_key="resume",
        press_fn=lambda device: device.resume(),
    ),
)


async def async_setup_entry(
    hass: HomeAssistant,
    entry: CasperGlowConfigEntry,
    async_add_entities: AddConfigEntryEntitiesCallback,
) -> None:
    """Set up the button platform for Casper Glow."""
    async_add_entities(
        CasperGlowButton(entry.runtime_data, description)
        for description in BUTTON_DESCRIPTIONS
    )


class CasperGlowButton(CasperGlowEntity, ButtonEntity):
    """A Casper Glow button entity."""

    entity_description: CasperGlowButtonEntityDescription

    def __init__(
        self,
        coordinator: CasperGlowCoordinator,
        description: CasperGlowButtonEntityDescription,
    ) -> None:
        """Initialize a Casper Glow button."""
        super().__init__(coordinator)
        self.entity_description = description
        self._attr_unique_id = (
            f"{format_mac(coordinator.device.address)}_{description.key}"
        )

    @override
    async def async_press(self) -> None:
        """Press the button."""
        await self._async_command(self.entity_description.press_fn(self._device))
