"""Support for Verisure sensors."""
import logging

from homeassistant.const import TEMP_CELSIUS, UNIT_PERCENTAGE
from homeassistant.helpers.entity import Entity

from . import CONF_HYDROMETERS, CONF_MOUSE, CONF_THERMOMETERS, HUB as hub

_LOGGER = logging.getLogger(__name__)


def setup_platform(hass, config, add_entities, discovery_info=None):
    """Set up the Verisure platform."""
    sensors = []
    hub.update_overview()

    if int(hub.config.get(CONF_THERMOMETERS, 1)):
        sensors.extend(
            [
                VerisureThermometer(device_label)
                for device_label in hub.get(
                    "$.climateValues[?(@.temperature)].deviceLabel"
                )
            ]
        )

    if int(hub.config.get(CONF_HYDROMETERS, 1)):
        sensors.extend(
            [
                VerisureHygrometer(device_label)
                for device_label in hub.get(
                    "$.climateValues[?(@.humidity)].deviceLabel"
                )
            ]
        )

    if int(hub.config.get(CONF_MOUSE, 1)):
        sensors.extend(
            [
                VerisureMouseDetection(device_label)
                for device_label in hub.get(
                    "$.eventCounts[?(@.deviceType=='MOUSE1')].deviceLabel"
                )
            ]
        )

    add_entities(sensors)


class VerisureThermometer(Entity):
    """Representation of a Verisure thermometer."""

    def __init__(self, device_label):
        """Initialize the sensor."""
        self._device_label = device_label

    @property
    def name(self):
        """Return the name of the device."""
        return (
            hub.get_first(
                "$.climateValues[?(@.deviceLabel=='%s')].deviceArea", self._device_label
            )
            + " temperature"
        )

    @property
    def state(self):
        """Return the state of the device."""
        return hub.get_first(
            "$.climateValues[?(@.deviceLabel=='%s')].temperature", self._device_label
        )

    @property
    def available(self):
        """Return True if entity is available."""
        return (
            hub.get_first(
                "$.climateValues[?(@.deviceLabel=='%s')].temperature",
                self._device_label,
            )
            is not None
        )

    @property
    def unit_of_measurement(self):
        """Return the unit of measurement of this entity."""
        return TEMP_CELSIUS

    # pylint: disable=no-self-use
    def update(self):
        """Update the sensor."""
        hub.update_overview()


class VerisureHygrometer(Entity):
    """Representation of a Verisure hygrometer."""

    def __init__(self, device_label):
        """Initialize the sensor."""
        self._device_label = device_label

    @property
    def name(self):
        """Return the name of the device."""
        return (
            hub.get_first(
                "$.climateValues[?(@.deviceLabel=='%s')].deviceArea", self._device_label
            )
            + " humidity"
        )

    @property
    def state(self):
        """Return the state of the device."""
        return hub.get_first(
            "$.climateValues[?(@.deviceLabel=='%s')].humidity", self._device_label
        )

    @property
    def available(self):
        """Return True if entity is available."""
        return (
            hub.get_first(
                "$.climateValues[?(@.deviceLabel=='%s')].humidity", self._device_label
            )
            is not None
        )

    @property
    def unit_of_measurement(self):
        """Return the unit of measurement of this entity."""
        return UNIT_PERCENTAGE

    # pylint: disable=no-self-use
    def update(self):
        """Update the sensor."""
        hub.update_overview()


class VerisureMouseDetection(Entity):
    """Representation of a Verisure mouse detector."""

    def __init__(self, device_label):
        """Initialize the sensor."""
        self._device_label = device_label

    @property
    def name(self):
        """Return the name of the device."""
        return (
            hub.get_first(
                "$.eventCounts[?(@.deviceLabel=='%s')].area", self._device_label
            )
            + " mouse"
        )

    @property
    def state(self):
        """Return the state of the device."""
        return hub.get_first(
            "$.eventCounts[?(@.deviceLabel=='%s')].detections", self._device_label
        )

    @property
    def available(self):
        """Return True if entity is available."""
        return (
            hub.get_first("$.eventCounts[?(@.deviceLabel=='%s')]", self._device_label)
            is not None
        )

    @property
    def unit_of_measurement(self):
        """Return the unit of measurement of this entity."""
        return "Mice"

    # pylint: disable=no-self-use
    def update(self):
        """Update the sensor."""
        hub.update_overview()
