"""
Support for Axis binary sensors.

For more details about this platform, please refer to the documentation at
https://home-assistant.io/components/binary_sensor.axis/
"""
from datetime import timedelta
import logging

from homeassistant.components.binary_sensor import BinarySensorDevice
from homeassistant.const import (
    ATTR_LOCATION, CONF_EVENT, CONF_NAME, CONF_TRIGGER_TIME)
from homeassistant.core import callback
from homeassistant.helpers.event import async_track_point_in_utc_time
from homeassistant.util.dt import utcnow

DEPENDENCIES = ['axis']

_LOGGER = logging.getLogger(__name__)


def setup_platform(hass, config, add_entities, discovery_info=None):
    """Set up the Axis binary devices."""
    add_entities([AxisBinarySensor(discovery_info)], True)


class AxisBinarySensor(BinarySensorDevice):
    """Representation of a binary Axis event."""

    def __init__(self, event_config):
        """Initialize the Axis binary sensor."""
        self.axis_event = event_config[CONF_EVENT]
        self.device_name = event_config[CONF_NAME]
        self.location = event_config[ATTR_LOCATION]
        self.delay = event_config[CONF_TRIGGER_TIME]
        self.remove_timer = None

    async def async_added_to_hass(self):
        """Subscribe sensors events."""
        self.axis_event.callback = self._update_callback

    def _update_callback(self):
        """Update the sensor's state, if needed."""
        if self.remove_timer is not None:
            self.remove_timer()
            self.remove_timer = None

        if self.delay == 0 or self.is_on:
            self.schedule_update_ha_state()
        else:  # Run timer to delay updating the state
            @callback
            def _delay_update(now):
                """Timer callback for sensor update."""
                _LOGGER.debug("%s called delayed (%s sec) update",
                              self.name, self.delay)
                self.async_schedule_update_ha_state()
                self.remove_timer = None

            self.remove_timer = async_track_point_in_utc_time(
                self.hass, _delay_update,
                utcnow() + timedelta(seconds=self.delay))

    @property
    def is_on(self):
        """Return true if event is active."""
        return self.axis_event.is_tripped

    @property
    def name(self):
        """Return the name of the event."""
        return '{}_{}_{}'.format(
            self.device_name, self.axis_event.event_type, self.axis_event.id)

    @property
    def device_class(self):
        """Return the class of the event."""
        return self.axis_event.event_class

    @property
    def should_poll(self):
        """No polling needed."""
        return False

    @property
    def device_state_attributes(self):
        """Return the state attributes of the event."""
        attr = {}

        attr[ATTR_LOCATION] = self.location

        return attr