"""Support Google Home units."""
import logging

import asyncio
import voluptuous as vol
from homeassistant.const import CONF_DEVICES, CONF_HOST
from homeassistant.helpers import discovery
import homeassistant.helpers.config_validation as cv
from homeassistant.helpers.aiohttp_client import async_get_clientsession

_LOGGER = logging.getLogger(__name__)

DOMAIN = "googlehome"
CLIENT = "googlehome_client"

NAME = "GoogleHome"

CONF_DEVICE_TYPES = "device_types"
CONF_RSSI_THRESHOLD = "rssi_threshold"
CONF_TRACK_ALARMS = "track_alarms"
CONF_TRACK_DEVICES = "track_devices"

DEVICE_TYPES = [1, 2, 3]
DEFAULT_RSSI_THRESHOLD = -70

DEVICE_CONFIG = vol.Schema(
    {
        vol.Required(CONF_HOST): cv.string,
        vol.Optional(CONF_DEVICE_TYPES, default=DEVICE_TYPES): vol.All(
            cv.ensure_list, [vol.In(DEVICE_TYPES)]
        ),
        vol.Optional(CONF_RSSI_THRESHOLD, default=DEFAULT_RSSI_THRESHOLD): vol.Coerce(
            int
        ),
        vol.Optional(CONF_TRACK_ALARMS, default=False): cv.boolean,
        vol.Optional(CONF_TRACK_DEVICES, default=True): cv.boolean,
    }
)


CONFIG_SCHEMA = vol.Schema(
    {
        DOMAIN: vol.Schema(
            {vol.Required(CONF_DEVICES): vol.All(cv.ensure_list, [DEVICE_CONFIG])}
        )
    },
    extra=vol.ALLOW_EXTRA,
)


async def async_setup(hass, config):
    """Set up the Google Home component."""
    hass.data[DOMAIN] = {}
    hass.data[CLIENT] = GoogleHomeClient(hass)

    for device in config[DOMAIN][CONF_DEVICES]:
        hass.data[DOMAIN][device["host"]] = {}
        if device[CONF_TRACK_DEVICES]:
            hass.async_create_task(
                discovery.async_load_platform(
                    hass, "device_tracker", DOMAIN, device, config
                )
            )

        if device[CONF_TRACK_ALARMS]:
            hass.async_create_task(
                discovery.async_load_platform(hass, "sensor", DOMAIN, device, config)
            )

    return True


class GoogleHomeClient:
    """Handle all communication with the Google Home unit."""

    def __init__(self, hass):
        """Initialize the Google Home Client."""
        self.hass = hass
        self._connected = None

    async def update_info(self, host):
        """Update data from Google Home."""
        from googledevices.api.connect import Cast

        _LOGGER.debug("Updating Google Home info for %s", host)
        session = async_get_clientsession(self.hass)

        device_info = await Cast(host, self.hass.loop, session).info()
        device_info_data = await device_info.get_device_info()
        self._connected = bool(device_info_data)

        self.hass.data[DOMAIN][host]["info"] = device_info_data

    async def update_bluetooth(self, host):
        """Update bluetooth from Google Home."""
        from googledevices.api.connect import Cast

        _LOGGER.debug("Updating Google Home bluetooth for %s", host)
        session = async_get_clientsession(self.hass)

        bluetooth = await Cast(host, self.hass.loop, session).bluetooth()
        await bluetooth.scan_for_devices()
        await asyncio.sleep(5)
        bluetooth_data = await bluetooth.get_scan_result()

        self.hass.data[DOMAIN][host]["bluetooth"] = bluetooth_data

    async def update_alarms(self, host):
        """Update alarms from Google Home."""
        from googledevices.api.connect import Cast

        _LOGGER.debug("Updating Google Home bluetooth for %s", host)
        session = async_get_clientsession(self.hass)

        assistant = await Cast(host, self.hass.loop, session).assistant()
        alarms_data = await assistant.get_alarms()

        self.hass.data[DOMAIN][host]["alarms"] = alarms_data
