"""Support for Epson Workforce Printer."""
from datetime import timedelta
import logging

import voluptuous as vol

from homeassistant.components.sensor import PLATFORM_SCHEMA
from homeassistant.const import CONF_HOST, CONF_MONITORED_CONDITIONS
from homeassistant.exceptions import PlatformNotReady
import homeassistant.helpers.config_validation as cv
from homeassistant.helpers.entity import Entity

REQUIREMENTS = ['epsonprinter==0.0.8']

_LOGGER = logging.getLogger(__name__)
MONITORED_CONDITIONS = {
    'black': ['Inklevel Black', '%', 'mdi:water'],
    'magenta': ['Inklevel Magenta', '%', 'mdi:water'],
    'cyan': ['Inklevel Cyan', '%', 'mdi:water'],
    'yellow': ['Inklevel Yellow', '%', 'mdi:water'],
    'clean': ['Inklevel Cleaning', '%', 'mdi:water'],
}
PLATFORM_SCHEMA = PLATFORM_SCHEMA.extend({
    vol.Required(CONF_HOST): cv.string,
    vol.Required(CONF_MONITORED_CONDITIONS):
        vol.All(cv.ensure_list, [vol.In(MONITORED_CONDITIONS)]),
})
SCAN_INTERVAL = timedelta(minutes=60)


def setup_platform(hass, config, add_devices, discovery_info=None):
    """Set up the cartridge sensor."""
    host = config.get(CONF_HOST)

    from epsonprinter_pkg.epsonprinterapi import EpsonPrinterAPI
    api = EpsonPrinterAPI(host)
    if not api.available:
        raise PlatformNotReady()

    sensors = [EpsonPrinterCartridge(api, condition)
               for condition in config[CONF_MONITORED_CONDITIONS]]

    add_devices(sensors, True)


class EpsonPrinterCartridge(Entity):
    """Representation of a cartridge sensor."""

    def __init__(self, api, cartridgeidx):
        """Initialize a cartridge sensor."""
        self._api = api

        self._id = cartridgeidx
        self._name = MONITORED_CONDITIONS[self._id][0]
        self._unit = MONITORED_CONDITIONS[self._id][1]
        self._icon = MONITORED_CONDITIONS[self._id][2]

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

    @property
    def icon(self):
        """Icon to use in the frontend, if any."""
        return self._icon

    @property
    def unit_of_measurement(self):
        """Return the unit the value is expressed in."""
        return self._unit

    @property
    def state(self):
        """Return the state of the device."""
        return self._api.getSensorValue(self._id)

    @property
    def available(self):
        """Could the device be accessed during the last update call."""
        return self._api.available

    def update(self):
        """Get the latest data from the Epson printer."""
        self._api.update()

[((15, 10, 15, 37), 'logging.getLogger', 'logging.getLogger', ({(15, 28, 15, 36): '__name__'}, {}), '(__name__)', False, 'import logging\n'), ((28, 16, 28, 37), 'datetime.timedelta', 'timedelta', (), '', False, 'from datetime import timedelta\n'), ((36, 10, 36, 31), 'epsonprinter_pkg.epsonprinterapi.EpsonPrinterAPI', 'EpsonPrinterAPI', ({(36, 26, 36, 30): 'host'}, {}), '(host)', False, 'from epsonprinter_pkg.epsonprinterapi import EpsonPrinterAPI\n'), ((24, 4, 24, 27), 'voluptuous.Required', 'vol.Required', ({(24, 17, 24, 26): 'CONF_HOST'}, {}), '(CONF_HOST)', True, 'import voluptuous as vol\n'), ((25, 4, 25, 43), 'voluptuous.Required', 'vol.Required', ({(25, 17, 25, 42): 'CONF_MONITORED_CONDITIONS'}, {}), '(CONF_MONITORED_CONDITIONS)', True, 'import voluptuous as vol\n'), ((38, 14, 38, 32), 'homeassistant.exceptions.PlatformNotReady', 'PlatformNotReady', ({}, {}), '()', False, 'from homeassistant.exceptions import PlatformNotReady\n'), ((26, 33, 26, 61), 'voluptuous.In', 'vol.In', ({(26, 40, 26, 60): 'MONITORED_CONDITIONS'}, {}), '(MONITORED_CONDITIONS)', True, 'import voluptuous as vol\n')]