"""A sensor platform that give you information about the next space launch."""
from datetime import timedelta
import logging

import voluptuous as vol

import homeassistant.helpers.config_validation as cv
from homeassistant.components.sensor import PLATFORM_SCHEMA
from homeassistant.const import ATTR_ATTRIBUTION, CONF_NAME
from homeassistant.helpers.entity import Entity
from homeassistant.helpers.aiohttp_client import async_get_clientsession

_LOGGER = logging.getLogger(__name__)

ATTRIBUTION = "Data provided by Launch Library."

DEFAULT_NAME = "Next launch"

SCAN_INTERVAL = timedelta(hours=1)

PLATFORM_SCHEMA = PLATFORM_SCHEMA.extend(
    {vol.Optional(CONF_NAME, default=DEFAULT_NAME): cv.string}
)


async def async_setup_platform(hass, config, async_add_entities, discovery_info=None):
    """Create the launch sensor."""
    from pylaunches.api import Launches

    name = config[CONF_NAME]

    session = async_get_clientsession(hass)
    launches = Launches(hass.loop, session)
    sensor = [LaunchLibrarySensor(launches, name)]
    async_add_entities(sensor, True)


class LaunchLibrarySensor(Entity):
    """Representation of a launch_library Sensor."""

    def __init__(self, launches, name):
        """Initialize the sensor."""
        self.launches = launches
        self._attributes = {}
        self._name = name
        self._state = None

    async def async_update(self):
        """Get the latest data."""
        await self.launches.get_launches()
        if self.launches.launches is None:
            _LOGGER.error("No data received")
            return
        try:
            data = self.launches.launches[0]
            self._state = data["name"]
            self._attributes["launch_time"] = data["start"]
            self._attributes["agency"] = data["agency"]
            agency_country_code = data["agency_country_code"]
            self._attributes["agency_country_code"] = agency_country_code
            self._attributes["stream"] = data["stream"]
            self._attributes[ATTR_ATTRIBUTION] = ATTRIBUTION
        except (KeyError, IndexError) as error:
            _LOGGER.debug("Error getting data, %s", error)

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

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

    @property
    def icon(self):
        """Return the icon of the sensor."""
        return "mdi:rocket"

    @property
    def device_state_attributes(self):
        """Return attributes for the sensor."""
        return self._attributes

"""A sensor platform that give you information about the next space launch."""
from datetime import timedelta
import logging

from pylaunches.api import Launches
import voluptuous as vol

from homeassistant.components.sensor import PLATFORM_SCHEMA
from homeassistant.const import ATTR_ATTRIBUTION, CONF_NAME
from homeassistant.helpers.aiohttp_client import async_get_clientsession
import homeassistant.helpers.config_validation as cv
from homeassistant.helpers.entity import Entity

_LOGGER = logging.getLogger(__name__)

ATTRIBUTION = "Data provided by Launch Library."

DEFAULT_NAME = "Next launch"

SCAN_INTERVAL = timedelta(hours=1)

PLATFORM_SCHEMA = PLATFORM_SCHEMA.extend(
    {vol.Optional(CONF_NAME, default=DEFAULT_NAME): cv.string}
)


async def async_setup_platform(hass, config, async_add_entities, discovery_info=None):
    """Create the launch sensor."""

    name = config[CONF_NAME]

    session = async_get_clientsession(hass)
    launches = Launches(hass.loop, session)
    sensor = [LaunchLibrarySensor(launches, name)]
    async_add_entities(sensor, True)


class LaunchLibrarySensor(Entity):
    """Representation of a launch_library Sensor."""

    def __init__(self, launches, name):
        """Initialize the sensor."""
        self.launches = launches
        self._attributes = {}
        self._name = name
        self._state = None

    async def async_update(self):
        """Get the latest data."""
        await self.launches.get_launches()
        if self.launches.launches is None:
            _LOGGER.error("No data received")
            return
        try:
            data = self.launches.launches[0]
            self._state = data["name"]
            self._attributes["launch_time"] = data["start"]
            self._attributes["agency"] = data["agency"]
            agency_country_code = data["agency_country_code"]
            self._attributes["agency_country_code"] = agency_country_code
            self._attributes["stream"] = data["stream"]
            self._attributes[ATTR_ATTRIBUTION] = ATTRIBUTION
        except (KeyError, IndexError) as error:
            _LOGGER.debug("Error getting data, %s", error)

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

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

    @property
    def icon(self):
        """Return the icon of the sensor."""
        return "mdi:rocket"

    @property
    def device_state_attributes(self):
        """Return attributes for the sensor."""
        return self._attributes

Move imports to top for lauch_library (#29383)