"""
Ryobi platform for the cover component.

For more details about this platform, please refer to the documentation
https://home-assistant.io/components/cover.ryobi_gdo/
"""
import logging
import voluptuous as vol

import homeassistant.helpers.config_validation as cv

from homeassistant.components.cover import (
    CoverDevice, PLATFORM_SCHEMA, SUPPORT_OPEN, SUPPORT_CLOSE)
from homeassistant.const import (
    CONF_USERNAME, CONF_PASSWORD, STATE_UNKNOWN, STATE_CLOSED)

REQUIREMENTS = ['py_ryobi_gdo==0.0.10']

_LOGGER = logging.getLogger(__name__)

CONF_DEVICE_ID = 'device_id'

PLATFORM_SCHEMA = PLATFORM_SCHEMA.extend({
    vol.Required(CONF_DEVICE_ID): vol.All(cv.ensure_list, [cv.string]),
    vol.Required(CONF_PASSWORD): cv.string,
    vol.Required(CONF_USERNAME): cv.string,
})

SUPPORTED_FEATURES = (SUPPORT_OPEN | SUPPORT_CLOSE)


def setup_platform(hass, config, add_entities, discovery_info=None):
    """Set up the Ryobi covers."""
    from py_ryobi_gdo import RyobiGDO as ryobi_door
    covers = []

    username = config.get(CONF_USERNAME)
    password = config.get(CONF_PASSWORD)
    devices = config.get(CONF_DEVICE_ID)

    for device_id in devices:
        my_door = ryobi_door(username, password, device_id)
        _LOGGER.debug("Getting the API key")
        if my_door.get_api_key() is False:
            _LOGGER.error("Wrong credentials, no API key retrieved")
            return
        _LOGGER.debug("Checking if the device ID is present")
        if my_door.check_device_id() is False:
            _LOGGER.error("%s not in your device list", device_id)
            return
        _LOGGER.debug("Adding device %s to covers", device_id)
        covers.append(RyobiCover(hass, my_door))
    if covers:
        _LOGGER.debug("Adding covers")
        add_entities(covers, True)


class RyobiCover(CoverDevice):
    """Representation of a ryobi cover."""

    def __init__(self, hass, ryobi_door):
        """Initialize the cover."""
        self.ryobi_door = ryobi_door
        self._name = 'ryobi_gdo_{}'.format(ryobi_door.get_device_id())
        self._door_state = None

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

    @property
    def is_closed(self):
        """Return if the cover is closed."""
        if self._door_state == STATE_UNKNOWN:
            return False
        return self._door_state == STATE_CLOSED

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

    @property
    def supported_features(self):
        """Flag supported features."""
        return SUPPORTED_FEATURES

    def close_cover(self, **kwargs):
        """Close the cover."""
        _LOGGER.debug("Closing garage door")
        self.ryobi_door.close_device()

    def open_cover(self, **kwargs):
        """Open the cover."""
        _LOGGER.debug("Opening garage door")
        self.ryobi_door.open_device()

    def update(self):
        """Update status from the door."""
        _LOGGER.debug("Updating RyobiGDO status")
        self.ryobi_door.update()
        self._door_state = self.ryobi_door.get_door_status()
