"""TOLO Sauna Select controls."""

from __future__ import annotations

from collections.abc import Callable
from dataclasses import dataclass

from tololib import ToloClient, ToloSettings

from homeassistant.components.select import SelectEntity, SelectEntityDescription
from homeassistant.config_entries import ConfigEntry
from homeassistant.const import EntityCategory
from homeassistant.core import HomeAssistant
from homeassistant.helpers.entity_platform import AddEntitiesCallback

from . import ToloSaunaCoordinatorEntity, ToloSaunaUpdateCoordinator
from .const import DOMAIN, AromaTherapySlot, LampMode


@dataclass(frozen=True, kw_only=True)
class ToloSelectEntityDescription(SelectEntityDescription):
    """Class describing TOLO select entities."""

    options: list[str]
    getter: Callable[[ToloSettings], str]
    setter: Callable[[ToloClient, str], bool]


SELECTS = (
    ToloSelectEntityDescription(
        key="lamp_mode",
        translation_key="lamp_mode",
        options=[lamp_mode.name.lower() for lamp_mode in LampMode],
        getter=lambda settings: settings.lamp_mode.name.lower(),
        setter=lambda client, option: client.set_lamp_mode(
            LampMode[option.upper()].value
        ),
    ),
    ToloSelectEntityDescription(
        key="aroma_therapy_slot",
        translation_key="aroma_therapy_slot",
        options=[
            aroma_therapy_slot.name.lower() for aroma_therapy_slot in AromaTherapySlot
        ],
        getter=lambda settings: settings.aroma_therapy_slot.name.lower(),
        setter=lambda client, option: client.set_aroma_therapy_slot(
            AromaTherapySlot[option.upper()].value
        ),
    ),
)


async def async_setup_entry(
    hass: HomeAssistant,
    entry: ConfigEntry,
    async_add_entities: AddEntitiesCallback,
) -> None:
    """Set up select entities for TOLO Sauna."""
    coordinator = hass.data[DOMAIN][entry.entry_id]
    async_add_entities(
        ToloSelectEntity(coordinator, entry, description) for description in SELECTS
    )


class ToloSelectEntity(ToloSaunaCoordinatorEntity, SelectEntity):
    """TOLO select entity."""

    _attr_entity_category = EntityCategory.CONFIG

    entity_description: ToloSelectEntityDescription

    def __init__(
        self,
        coordinator: ToloSaunaUpdateCoordinator,
        entry: ConfigEntry,
        entity_description: ToloSelectEntityDescription,
    ) -> None:
        """Initialize TOLO select entity."""
        super().__init__(coordinator, entry)
        self.entity_description = entity_description
        self._attr_unique_id = f"{entry.entry_id}_{entity_description.key}"

    @property
    def options(self) -> list[str]:
        """Return available select options."""
        return self.entity_description.options

    @property
    def current_option(self) -> str:
        """Return current select option."""
        return self.entity_description.getter(self.coordinator.data.settings)

    def select_option(self, option: str) -> None:
        """Select a select option."""
        self.entity_description.setter(self.coordinator.client, option)