"""Support for madVR remote control."""

from __future__ import annotations

from collections.abc import Iterable
import logging
from typing import Any

from homeassistant.components.remote import RemoteEntity
from homeassistant.core import HomeAssistant
from homeassistant.helpers.entity_platform import AddEntitiesCallback

from . import MadVRConfigEntry
from .coordinator import MadVRCoordinator
from .entity import MadVREntity

_LOGGER = logging.getLogger(__name__)


async def async_setup_entry(
    hass: HomeAssistant,
    entry: MadVRConfigEntry,
    async_add_entities: AddEntitiesCallback,
) -> None:
    """Set up the madVR remote."""
    coordinator = entry.runtime_data
    async_add_entities(
        [
            MadvrRemote(coordinator),
        ]
    )


class MadvrRemote(MadVREntity, RemoteEntity):
    """Remote entity for the madVR integration."""

    _attr_name = None

    def __init__(
        self,
        coordinator: MadVRCoordinator,
    ) -> None:
        """Initialize the remote entity."""
        super().__init__(coordinator)
        self.madvr_client = coordinator.client
        self._attr_unique_id = coordinator.mac

    @property
    def is_on(self) -> bool:
        """Return true if the device is on."""
        return self.madvr_client.is_on

    async def async_turn_off(self, **kwargs: Any) -> None:
        """Turn off the device."""
        _LOGGER.debug("Turning off")
        try:
            await self.madvr_client.power_off()
        except (ConnectionError, NotImplementedError) as err:
            _LOGGER.error("Failed to turn off device %s", err)

    async def async_turn_on(self, **kwargs: Any) -> None:
        """Turn on the device."""
        _LOGGER.debug("Turning on device")

        try:
            await self.madvr_client.power_on(mac=self.coordinator.mac)
        except (ConnectionError, NotImplementedError) as err:
            _LOGGER.error("Failed to turn on device %s", err)

    async def async_send_command(self, command: Iterable[str], **kwargs: Any) -> None:
        """Send a command to one device."""
        _LOGGER.debug("adding command %s", command)
        try:
            await self.madvr_client.add_command_to_queue(command)
        except (ConnectionError, NotImplementedError) as err:
            _LOGGER.error("Failed to send command %s", err)