"""Sensor platform for connection status.."""
from homeassistant.const import CONF_HOST, CONF_PORT, CONF_VERIFY_SSL
from homeassistant.helpers.dispatcher import async_dispatcher_connect
from homeassistant.helpers.entity import DeviceInfo, Entity

from .const import DOMAIN, CONF_ENTITY_PREFIX, CONF_SECURE, CONF_MAX_MSG_SIZE, DEFAULT_MAX_MSG_SIZE


async def async_setup_entry(hass, config_entry, async_add_entities):
    """Set up sensor based ok config entry."""
    async_add_entities([ConnectionStatusSensor(config_entry)])


class ConnectionStatusSensor(Entity):
    """Representation of a remote_homeassistant sensor."""

    def __init__(self, config_entry):
        """Initialize the remote_homeassistant sensor."""
        self._state = None
        self._entry = config_entry

        proto = 'http' if config_entry.data.get(CONF_SECURE) else 'https'
        host = config_entry.data[CONF_HOST]
        port = config_entry.data[CONF_PORT]
        self._attr_name = f"Remote connection to {host}:{port}"
        self._attr_unique_id = config_entry.unique_id
        self._attr_should_poll = False
        self._attr_device_info = DeviceInfo(
            name="Home Assistant",
            configuration_url=f"{proto}://{host}:{port}",
            identifiers={(DOMAIN, f"remote_{self._attr_unique_id}")},
        )

    @property
    def state(self):
        """Return sensor state."""
        return self._state

    @property
    def extra_state_attributes(self):
        """Return device state attributes."""
        return {
            "host": self._entry.data[CONF_HOST],
            "port": self._entry.data[CONF_PORT],
            "secure": self._entry.data.get(CONF_SECURE, False),
            "verify_ssl": self._entry.data.get(CONF_VERIFY_SSL, False),
            "max_msg_size": self._entry.data.get(CONF_MAX_MSG_SIZE, DEFAULT_MAX_MSG_SIZE),
            "entity_prefix": self._entry.options.get(CONF_ENTITY_PREFIX, ""),
            "uuid": self.unique_id,
        }

    async def async_added_to_hass(self):
        """Subscribe to events."""
        await super().async_added_to_hass()

        def _update_handler(state):
            """Update entity state when status was updated."""
            self._state = state
            self.schedule_update_ha_state()

        signal = f"remote_homeassistant_{self._entry.unique_id}"
        self.async_on_remove(
            async_dispatcher_connect(self.hass, signal, _update_handler)
        )