"""Button entities for the Motionblinds Bluetooth integration."""

from collections.abc import Callable, Coroutine
from dataclasses import dataclass
import logging
from typing import Any, override

from motionblindsble.device import MotionDevice

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 MotionConfigEntry
from .const import ATTR_CONNECT, ATTR_DISCONNECT, ATTR_FAVORITE, CONF_MAC_CODE
from .entity import MotionblindsBLEEntity

_LOGGER = logging.getLogger(__name__)

PARALLEL_UPDATES = 0


@dataclass(frozen=True, kw_only=True)
class MotionblindsBLEButtonEntityDescription(ButtonEntityDescription):
    """Entity description of a button entity with command attribute."""

    command: Callable[[MotionDevice], Coroutine[Any, Any, None]]


BUTTON_TYPES: list[MotionblindsBLEButtonEntityDescription] = [
    MotionblindsBLEButtonEntityDescription(
        key=ATTR_CONNECT,
        translation_key=ATTR_CONNECT,
        entity_category=EntityCategory.CONFIG,
        command=lambda device: device.connect(),
    ),
    MotionblindsBLEButtonEntityDescription(
        key=ATTR_DISCONNECT,
        translation_key=ATTR_DISCONNECT,
        entity_category=EntityCategory.CONFIG,
        command=lambda device: device.disconnect(),
    ),
    MotionblindsBLEButtonEntityDescription(
        key=ATTR_FAVORITE,
        translation_key=ATTR_FAVORITE,
        entity_category=EntityCategory.CONFIG,
        command=lambda device: device.favorite(),
    ),
]


async def async_setup_entry(
    hass: HomeAssistant,
    entry: MotionConfigEntry,
    async_add_entities: AddConfigEntryEntitiesCallback,
) -> None:
    """Set up button entities based on a config entry."""

    device = entry.runtime_data

    async_add_entities(
        MotionblindsBLEButtonEntity(
            device,
            entry,
            entity_description,
            unique_id_suffix=entity_description.key,
        )
        for entity_description in BUTTON_TYPES
    )


class MotionblindsBLEButtonEntity(MotionblindsBLEEntity, ButtonEntity):
    """Representation of a button entity."""

    entity_description: MotionblindsBLEButtonEntityDescription

    @override
    async def async_added_to_hass(self) -> None:
        """Log button entity information."""
        _LOGGER.debug(
            "(%s) Setting up %s button entity",
            self.entry.data[CONF_MAC_CODE],
            self.entity_description.key,
        )

    @override
    async def async_press(self) -> None:
        """Handle the button press."""
        await self.entity_description.command(self.device)
