"""Support for Google Home alarm sensor."""
from datetime import timedelta
import logging

from homeassistant.const import DEVICE_CLASS_TIMESTAMP
from homeassistant.helpers.entity import Entity
import homeassistant.util.dt as dt_util

from . import CLIENT, DOMAIN as GOOGLEHOME_DOMAIN, NAME

SCAN_INTERVAL = timedelta(seconds=10)

_LOGGER = logging.getLogger(__name__)

ICON = "mdi:alarm"

SENSOR_TYPES = {"timer": "Timer", "alarm": "Alarm"}


async def async_setup_platform(hass, config, async_add_entities, discovery_info=None):
    """Set up the googlehome sensor platform."""
    if discovery_info is None:
        _LOGGER.warning("To use this you need to configure the 'googlehome' component")
        return

    await hass.data[CLIENT].update_info(discovery_info["host"])
    data = hass.data[GOOGLEHOME_DOMAIN][discovery_info["host"]]
    info = data.get("info", {})

    devices = []
    for condition in SENSOR_TYPES:
        device = GoogleHomeAlarm(
            hass.data[CLIENT], condition, discovery_info, info.get("name", NAME)
        )
        devices.append(device)

    async_add_entities(devices, True)


class GoogleHomeAlarm(Entity):
    """Representation of a GoogleHomeAlarm."""

    def __init__(self, client, condition, config, name):
        """Initialize the GoogleHomeAlarm sensor."""
        self._host = config["host"]
        self._client = client
        self._condition = condition
        self._name = None
        self._state = None
        self._available = True
        self._name = "{} {}".format(name, SENSOR_TYPES[self._condition])

    async def async_update(self):
        """Update the data."""
        await self._client.update_alarms(self._host)
        data = self.hass.data[GOOGLEHOME_DOMAIN][self._host]

        alarms = data.get("alarms")[self._condition]
        if not alarms:
            self._available = False
            return
        self._available = True
        time_date = dt_util.utc_from_timestamp(
            min(element["fire_time"] for element in alarms) / 1000
        )
        self._state = time_date.isoformat()

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

    @property
    def name(self):
        """Return the name."""
        return self._name

    @property
    def device_class(self):
        """Return the device class."""
        return DEVICE_CLASS_TIMESTAMP

    @property
    def available(self):
        """Return the availability state."""
        return self._available

    @property
    def icon(self):
        """Return the icon."""
        return ICON
