"""Cover Platform for the Somfy MyLink component."""
import logging

from homeassistant.components.cover import ENTITY_ID_FORMAT, CoverDevice
from homeassistant.util import slugify

from . import CONF_DEFAULT_REVERSE, DATA_SOMFY_MYLINK

_LOGGER = logging.getLogger(__name__)


async def async_setup_platform(hass,
                               config,
                               async_add_entities,
                               discovery_info=None):
    """Discover and configure Somfy covers."""
    if discovery_info is None:
        return
    somfy_mylink = hass.data[DATA_SOMFY_MYLINK]
    cover_list = []
    try:
        mylink_status = await somfy_mylink.status_info()
    except TimeoutError:
        _LOGGER.error("Unable to connect to the Somfy MyLink device, "
                      "please check your settings")
        return
    for cover in mylink_status['result']:
        entity_id = ENTITY_ID_FORMAT.format(slugify(cover['name']))
        entity_config = discovery_info.get(entity_id, {})
        default_reverse = discovery_info[CONF_DEFAULT_REVERSE]
        cover_config = {}
        cover_config['target_id'] = cover['targetID']
        cover_config['name'] = cover['name']
        cover_config['reverse'] = entity_config.get('reverse', default_reverse)
        cover_list.append(SomfyShade(somfy_mylink, **cover_config))
        _LOGGER.info('Adding Somfy Cover: %s with targetID %s',
                     cover_config['name'], cover_config['target_id'])
    async_add_entities(cover_list)


class SomfyShade(CoverDevice):
    """Object for controlling a Somfy cover."""

    def __init__(self, somfy_mylink, target_id='AABBCC', name='SomfyShade',
                 reverse=False, device_class='window'):
        """Initialize the cover."""
        self.somfy_mylink = somfy_mylink
        self._target_id = target_id
        self._name = name
        self._reverse = reverse
        self._device_class = device_class

    @property
    def name(self):
        """Return the name of the cover."""
        return self._name

    @property
    def is_closed(self):
        """Return if the cover is closed."""
        return None

    @property
    def assumed_state(self):
        """Let HA know the integration is assumed state."""
        return True

    @property
    def device_class(self):
        """Return the class of this device, from component DEVICE_CLASSES."""
        return self._device_class

    async def async_open_cover(self, **kwargs):
        """Wrap Homeassistant calls to open the cover."""
        if not self._reverse:
            await self.somfy_mylink.move_up(self._target_id)
        else:
            await self.somfy_mylink.move_down(self._target_id)

    async def async_close_cover(self, **kwargs):
        """Wrap Homeassistant calls to close the cover."""
        if not self._reverse:
            await self.somfy_mylink.move_down(self._target_id)
        else:
            await self.somfy_mylink.move_up(self._target_id)

    async def async_stop_cover(self, **kwargs):
        """Stop the cover."""
        await self.somfy_mylink.move_stop(self._target_id)
