"""Support for Insteon covers via PowerLinc Modem."""
import logging
import math

from homeassistant.components.cover import (
    ATTR_POSITION,
    SUPPORT_CLOSE,
    SUPPORT_OPEN,
    SUPPORT_SET_POSITION,
    CoverDevice,
)

from . import InsteonEntity

_LOGGER = logging.getLogger(__name__)

SUPPORTED_FEATURES = SUPPORT_OPEN | SUPPORT_CLOSE | SUPPORT_SET_POSITION


async def async_setup_platform(hass, config, async_add_entities, discovery_info=None):
    """Set up the Insteon platform."""
    if not discovery_info:
        return

    insteon_modem = hass.data["insteon"].get("modem")

    address = discovery_info["address"]
    device = insteon_modem.devices[address]
    state_key = discovery_info["state_key"]

    _LOGGER.debug(
        "Adding device %s entity %s to Cover platform",
        device.address.hex,
        device.states[state_key].name,
    )

    new_entity = InsteonCoverDevice(device, state_key)

    async_add_entities([new_entity])


class InsteonCoverDevice(InsteonEntity, CoverDevice):
    """A Class for an Insteon device."""

    @property
    def current_cover_position(self):
        """Return the current cover position."""
        return int(math.ceil(self._insteon_device_state.value * 100 / 255))

    @property
    def supported_features(self):
        """Return the supported features for this entity."""
        return SUPPORTED_FEATURES

    @property
    def is_closed(self):
        """Return the boolean response if the node is on."""
        return bool(self.current_cover_position)

    async def async_open_cover(self, **kwargs):
        """Open device."""
        self._insteon_device_state.open()

    async def async_close_cover(self, **kwargs):
        """Close device."""
        self._insteon_device_state.close()

    async def async_set_cover_position(self, **kwargs):
        """Set the cover position."""
        position = int(kwargs[ATTR_POSITION] * 255 / 100)
        if position == 0:
            self._insteon_device_state.close()
        else:
            self._insteon_device_state.set_position(position)
