"""Base class for August entity."""

import logging

from homeassistant.core import callback
from homeassistant.helpers.entity import Entity

from . import DOMAIN
from .const import MANUFACTURER

_LOGGER = logging.getLogger(__name__)


class AugustEntityMixin(Entity):
    """Base implementation for August device."""

    def __init__(self, data, device):
        """Initialize an August device."""
        super().__init__()
        self._data = data
        self._device = device

    @property
    def should_poll(self):
        """Return False, updates are controlled via the hub."""
        return False

    @property
    def _device_id(self):
        return self._device.device_id

    @property
    def _detail(self):
        return self._data.get_device_detail(self._device.device_id)

    @property
    def device_info(self):
        """Return the device_info of the device."""
        return {
            "identifiers": {(DOMAIN, self._device_id)},
            "name": self._device.device_name,
            "manufacturer": MANUFACTURER,
            "sw_version": self._detail.firmware_version,
            "model": self._detail.model,
        }

    @callback
    def _update_from_data_and_write_state(self):
        self._update_from_data()
        self.async_write_ha_state()

    async def async_added_to_hass(self):
        """Subscribe to updates."""
        self._data.async_subscribe_device_id(
            self._device_id, self._update_from_data_and_write_state
        )
        self._data.activity_stream.async_subscribe_device_id(
            self._device_id, self._update_from_data_and_write_state
        )

    async def async_will_remove_from_hass(self):
        """Undo subscription."""
        self._data.async_unsubscribe_device_id(
            self._device_id, self._update_from_data_and_write_state
        )
        self._data.activity_stream.async_unsubscribe_device_id(
            self._device_id, self._update_from_data_and_write_state
        )
