"""Support to control a Salda Smarty XP/XV ventilation unit."""

from datetime import timedelta

import ipaddress
import logging
import voluptuous as vol

from homeassistant.const import (CONF_NAME, CONF_HOST)
from homeassistant.helpers import discovery
import homeassistant.helpers.config_validation as cv
from homeassistant.helpers.dispatcher import dispatcher_send
from homeassistant.helpers.event import track_time_interval

DOMAIN = 'smarty'
DATA_SMARTY = 'smarty'
SMARTY_NAME = 'Smarty'

_LOGGER = logging.getLogger(__name__)

CONFIG_SCHEMA = vol.Schema(
    {
        DOMAIN: vol.Schema({
            vol.Required(CONF_HOST): vol.All(ipaddress.ip_address, cv.string),
            vol.Optional(CONF_NAME, default=SMARTY_NAME): cv.string
        }),
    },
    extra=vol.ALLOW_EXTRA)

RPM = 'rpm'
SIGNAL_UPDATE_SMARTY = 'smarty_update'


def setup(hass, config):
    """Set up the smarty environment."""
    from pysmarty import (Smarty)
    conf = config[DOMAIN]

    host = conf[CONF_HOST]
    name = conf[CONF_NAME]

    _LOGGER.debug("Name: %s, host: %s", name, host)

    smarty = Smarty(host=host)

    hass.data[DOMAIN] = {
        'api': smarty,
        'name': name
    }

    # Initial update
    smarty.update()

    # Load platforms
    discovery.load_platform(hass, 'fan', DOMAIN, {}, config)
    discovery.load_platform(hass, 'sensor', DOMAIN, {}, config)
    discovery.load_platform(hass, 'binary_sensor', DOMAIN, {}, config)

    def poll_device_update(event_time):
        """Update Smarty device."""
        _LOGGER.debug("Updating Smarty device...")
        if smarty.update():
            _LOGGER.debug("Update success...")
            dispatcher_send(hass, SIGNAL_UPDATE_SMARTY)
        else:
            _LOGGER.debug("Update failed...")

    track_time_interval(hass, poll_device_update,
                        timedelta(seconds=30))

    return True
