"""Support for Notion binary sensors."""
import logging

from homeassistant.components.binary_sensor import BinarySensorDevice

from . import (
    BINARY_SENSOR_TYPES, SENSOR_BATTERY, SENSOR_DOOR, SENSOR_GARAGE_DOOR,
    SENSOR_LEAK, SENSOR_MISSING, SENSOR_SAFE, SENSOR_SLIDING, SENSOR_SMOKE_CO,
    SENSOR_WINDOW_HINGED_HORIZONTAL, SENSOR_WINDOW_HINGED_VERTICAL,
    NotionEntity)

from .const import DATA_CLIENT, DOMAIN

_LOGGER = logging.getLogger(__name__)


async def async_setup_entry(hass, entry, async_add_entities):
    """Set up Notion sensors based on a config entry."""
    notion = hass.data[DOMAIN][DATA_CLIENT][entry.entry_id]

    sensor_list = []
    for task_id, task in notion.tasks.items():
        if task['task_type'] not in BINARY_SENSOR_TYPES:
            continue

        name, device_class = BINARY_SENSOR_TYPES[task['task_type']]
        sensor = notion.sensors[task['sensor_id']]

        sensor_list.append(
            NotionBinarySensor(
                notion,
                task_id,
                sensor['id'],
                sensor['bridge']['id'],
                sensor['system_id'],
                name,
                device_class))

    async_add_entities(sensor_list, True)


class NotionBinarySensor(NotionEntity, BinarySensorDevice):
    """Define a Notion sensor."""

    @property
    def is_on(self):
        """Return whether the sensor is on or off."""
        task = self._notion.tasks[self._task_id]

        if task['task_type'] == SENSOR_BATTERY:
            return self._state != 'battery_good'
        if task['task_type'] in (
                SENSOR_DOOR, SENSOR_GARAGE_DOOR, SENSOR_SAFE, SENSOR_SLIDING,
                SENSOR_WINDOW_HINGED_HORIZONTAL,
                SENSOR_WINDOW_HINGED_VERTICAL):
            return self._state != 'closed'
        if task['task_type'] == SENSOR_LEAK:
            return self._state != 'no_leak'
        if task['task_type'] == SENSOR_MISSING:
            return self._state == 'not_missing'
        if task['task_type'] == SENSOR_SMOKE_CO:
            return self._state != 'no_alarm'

    async def async_update(self):
        """Fetch new state data for the sensor."""
        task = self._notion.tasks[self._task_id]

        self._state = task['status']['value']
