"""The Homee select platform."""

from pyHomee.const import AttributeType
from pyHomee.model import HomeeAttribute, HomeeNode

from homeassistant.components.select import SelectEntity, SelectEntityDescription
from homeassistant.const import EntityCategory
from homeassistant.core import HomeAssistant
from homeassistant.helpers.entity_platform import AddConfigEntryEntitiesCallback

from . import HomeeConfigEntry
from .entity import HomeeEntity
from .helpers import setup_homee_platform

PARALLEL_UPDATES = 0

SELECT_DESCRIPTIONS: dict[AttributeType, SelectEntityDescription] = {
    AttributeType.DISPLAY_TEMPERATURE_SELECTION: SelectEntityDescription(
        key="display_temperature_selection",
        options=["target", "current"],
        entity_category=EntityCategory.CONFIG,
    ),
    AttributeType.REPEATER_MODE: SelectEntityDescription(
        key="repeater_mode",
        options=["off", "level1", "level2"],
        entity_category=EntityCategory.CONFIG,
    ),
}


async def add_select_entities(
    config_entry: HomeeConfigEntry,
    async_add_entities: AddConfigEntryEntitiesCallback,
    nodes: list[HomeeNode],
) -> None:
    """Add homee select entities."""
    async_add_entities(
        HomeeSelect(attribute, config_entry, SELECT_DESCRIPTIONS[attribute.type])
        for node in nodes
        for attribute in node.attributes
        if attribute.type in SELECT_DESCRIPTIONS and attribute.editable
    )


async def async_setup_entry(
    hass: HomeAssistant,
    config_entry: HomeeConfigEntry,
    async_add_entities: AddConfigEntryEntitiesCallback,
) -> None:
    """Add the homee platform for the select component."""

    await setup_homee_platform(add_select_entities, async_add_entities, config_entry)


class HomeeSelect(HomeeEntity, SelectEntity):
    """Representation of a Homee select entity."""

    def __init__(
        self,
        attribute: HomeeAttribute,
        entry: HomeeConfigEntry,
        description: SelectEntityDescription,
    ) -> None:
        """Initialize a Homee select entity."""
        super().__init__(attribute, entry)
        self.entity_description = description
        assert description.options is not None
        self._attr_options = description.options
        self._attr_translation_key = description.key

    @property
    def current_option(self) -> str:
        """Return the current selected option."""
        return self.options[int(self._attribute.current_value)]

    async def async_select_option(self, option: str) -> None:
        """Change the selected option."""
        await self.async_set_homee_value(self.options.index(option))
