"""
Support for Canary sensors.

For more details about this platform, please refer to the documentation at
https://home-assistant.io/components/sensor.canary/
"""
from homeassistant.components.canary import DATA_CANARY
from homeassistant.const import TEMP_FAHRENHEIT, TEMP_CELSIUS
from homeassistant.helpers.entity import Entity

DEPENDENCIES = ['canary']

SENSOR_VALUE_PRECISION = 1


def setup_platform(hass, config, add_devices, discovery_info=None):
    """Set up the Canary sensors."""
    data = hass.data[DATA_CANARY]
    devices = []

    from canary.api import SensorType
    for location in data.locations:
        for device in location.devices:
            if device.is_online:
                for sensor_type in SensorType:
                    devices.append(CanarySensor(data, sensor_type, location,
                                                device))

    add_devices(devices, True)


class CanarySensor(Entity):
    """Representation of a Canary sensor."""

    def __init__(self, data, sensor_type, location, device):
        """Initialize the sensor."""
        self._data = data
        self._sensor_type = sensor_type
        self._device_id = device.device_id
        self._is_celsius = location.is_celsius
        self._sensor_value = None

        sensor_type_name = sensor_type.value.replace("_", " ").title()
        self._name = '{} {} {}'.format(location.name,
                                       device.name,
                                       sensor_type_name)

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

    @property
    def state(self):
        """Return the state of the sensor."""
        return self._sensor_value

    @property
    def unique_id(self):
        """Return the unique ID of this sensor."""
        return "sensor_canary_{}_{}".format(self._device_id,
                                            self._sensor_type.value)

    @property
    def unit_of_measurement(self):
        """Return the unit of measurement this sensor expresses itself in."""
        from canary.api import SensorType
        if self._sensor_type == SensorType.TEMPERATURE:
            return TEMP_CELSIUS if self._is_celsius else TEMP_FAHRENHEIT
        elif self._sensor_type == SensorType.HUMIDITY:
            return "%"
        elif self._sensor_type == SensorType.AIR_QUALITY:
            return ""
        return None

    def update(self):
        """Get the latest state of the sensor."""
        self._data.update()

        readings = self._data.get_readings(self._device_id)
        value = next((
            reading.value for reading in readings
            if reading.sensor_type == self._sensor_type), None)
        if value is not None:
            self._sensor_value = round(float(value), SENSOR_VALUE_PRECISION)