"""Platform for the opengarage.io binary sensor component."""
from __future__ import annotations

import logging

from homeassistant.components.binary_sensor import (
    BinarySensorEntity,
    BinarySensorEntityDescription,
)
from homeassistant.config_entries import ConfigEntry
from homeassistant.core import HomeAssistant, callback
from homeassistant.helpers.entity_platform import AddEntitiesCallback

from .const import DOMAIN
from .entity import OpenGarageEntity

_LOGGER = logging.getLogger(__name__)


SENSOR_TYPES: tuple[BinarySensorEntityDescription, ...] = (
    BinarySensorEntityDescription(
        key="vehicle",
    ),
)


async def async_setup_entry(
    hass: HomeAssistant, entry: ConfigEntry, async_add_entities: AddEntitiesCallback
) -> None:
    """Set up the OpenGarage binary sensors."""
    open_garage_data_coordinator = hass.data[DOMAIN][entry.entry_id]
    async_add_entities(
        [
            OpenGarageBinarySensor(
                open_garage_data_coordinator,
                entry.unique_id,
                description,
            )
            for description in SENSOR_TYPES
        ],
    )


class OpenGarageBinarySensor(OpenGarageEntity, BinarySensorEntity):
    """Representation of a OpenGarage binary sensor."""

    def __init__(self, open_garage_data_coordinator, device_id, description):
        """Initialize the entity."""
        self._available = False
        super().__init__(open_garage_data_coordinator, device_id, description)

    @property
    def available(self) -> bool:
        """Return True if entity is available."""
        return super().available and self._available

    @callback
    def _update_attr(self) -> None:
        """Handle updated data from the coordinator."""
        self._attr_name = (
            f'{self.coordinator.data["name"]} {self.entity_description.key}'
        )
        state = self.coordinator.data.get(self.entity_description.key)
        if state == 1:
            self._attr_is_on = True
            self._available = True
        elif state == 0:
            self._attr_is_on = False
            self._available = True
        else:
            self._available = False
