"""Support for INSTEON dimmers via PowerLinc Modem."""
from pyinsteon.groups import (
    CO_SENSOR,
    DOOR_SENSOR,
    HEARTBEAT,
    LEAK_SENSOR_WET,
    LIGHT_SENSOR,
    LOW_BATTERY,
    MOTION_SENSOR,
    OPEN_CLOSE_SENSOR,
    SENSOR_MALFUNCTION,
    SMOKE_SENSOR,
    TEST_SENSOR,
)

from homeassistant.components.binary_sensor import (
    DOMAIN as BINARY_SENSOR_DOMAIN,
    BinarySensorDeviceClass,
    BinarySensorEntity,
)
from homeassistant.config_entries import ConfigEntry
from homeassistant.core import HomeAssistant, callback
from homeassistant.helpers.dispatcher import async_dispatcher_connect
from homeassistant.helpers.entity_platform import AddEntitiesCallback

from .const import SIGNAL_ADD_ENTITIES
from .insteon_entity import InsteonEntity
from .utils import async_add_insteon_entities

SENSOR_TYPES = {
    OPEN_CLOSE_SENSOR: BinarySensorDeviceClass.OPENING,
    MOTION_SENSOR: BinarySensorDeviceClass.MOTION,
    DOOR_SENSOR: BinarySensorDeviceClass.DOOR,
    LEAK_SENSOR_WET: BinarySensorDeviceClass.MOISTURE,
    LIGHT_SENSOR: BinarySensorDeviceClass.LIGHT,
    LOW_BATTERY: BinarySensorDeviceClass.BATTERY,
    CO_SENSOR: BinarySensorDeviceClass.GAS,
    SMOKE_SENSOR: BinarySensorDeviceClass.SMOKE,
    TEST_SENSOR: BinarySensorDeviceClass.SAFETY,
    SENSOR_MALFUNCTION: BinarySensorDeviceClass.PROBLEM,
    HEARTBEAT: BinarySensorDeviceClass.PROBLEM,
}


async def async_setup_entry(
    hass: HomeAssistant,
    config_entry: ConfigEntry,
    async_add_entities: AddEntitiesCallback,
) -> None:
    """Set up the Insteon binary sensors from a config entry."""

    @callback
    def async_add_insteon_binary_sensor_entities(discovery_info=None):
        """Add the Insteon entities for the platform."""
        async_add_insteon_entities(
            hass,
            BINARY_SENSOR_DOMAIN,
            InsteonBinarySensorEntity,
            async_add_entities,
            discovery_info,
        )

    signal = f"{SIGNAL_ADD_ENTITIES}_{BINARY_SENSOR_DOMAIN}"
    async_dispatcher_connect(hass, signal, async_add_insteon_binary_sensor_entities)
    async_add_insteon_binary_sensor_entities()


class InsteonBinarySensorEntity(InsteonEntity, BinarySensorEntity):
    """A Class for an Insteon binary sensor entity."""

    def __init__(self, device, group):
        """Initialize the INSTEON binary sensor."""
        super().__init__(device, group)
        self._sensor_type = SENSOR_TYPES.get(self._insteon_device_group.name)

    @property
    def device_class(self):
        """Return the class of this sensor."""
        return self._sensor_type

    @property
    def is_on(self):
        """Return the boolean response if the node is on."""
        return bool(self._insteon_device_group.value)