Загрузка данных


"""Configuration flows."""

from __future__ import annotations

import logging

from homeassistant import config_entries
from homeassistant.const import CONF_API_KEY, CONF_LATITUDE, CONF_LONGITUDE, CONF_NAME
from homeassistant.core import HomeAssistant, callback
import homeassistant.helpers.config_validation as cv
import voluptuous as vol

from .const import (
    CONDITION_IMAGE,
    CONF_IMAGE_SOURCE,
    CONF_LANGUAGE_KEY,
    CONF_UPDATES_PER_DAY,
    DEFAULT_NAME,
    DEFAULT_UPDATES_PER_DAY,
    DOMAIN,
)
from .updater import WeatherUpdater

_LOGGER = logging.getLogger(__name__)


def get_supported_languages() -> list[str]:
    """Get supported translations."""
    return ["EN", "RU"]


def get_value(config_entry: config_entries | None, param: str, default=None):
    """Get current value for configuration parameter.

    :param config_entry: config_entries|None: config entry from Flow
    :param param: str: parameter name for getting value
    :param default: default value for parameter, defaults to None
    :returns: parameter value, or default value or None
    """
    if config_entry is not None:
        return config_entry.options.get(param, config_entry.data.get(param, default))
    else:
        return default


class YandexWeatherConfigFlow(config_entries.ConfigFlow, domain=DOMAIN):
    """First time set up flow."""

    VERSION = 4
    MINOR_VERSION = 5

    @staticmethod
    @callback
    def async_get_options_flow(config_entry):
        """Get the options flow for this handler."""
        return YandexWeatherOptionsFlow()

    async def async_step_user(self, user_input=None):
        """Handle a flow initialized by the user."""
        errors = {}

        if user_input is not None:
            latitude = user_input[CONF_LATITUDE]
            longitude = user_input[CONF_LONGITUDE]

            await self.async_set_unique_id(f"{latitude}-{longitude}")
            self._abort_if_unique_id_configured()

            if await _is_online(
                user_input[CONF_API_KEY], latitude, longitude, self.hass
            ):
                return self.async_create_entry(
                    title=user_input[CONF_NAME], data=user_input
                )
            else:
                errors["base"] = "could_not_get_data"

        schema = vol.Schema(
            {
                vol.Required(CONF_API_KEY): str,
                vol.Optional(CONF_NAME, default=DEFAULT_NAME): str,
                vol.Optional(
                    CONF_LATITUDE, default=self.hass.config.latitude
                ): cv.latitude,
                vol.Optional(
                    CONF_LONGITUDE, default=self.hass.config.longitude
                ): cv.longitude,
                vol.Optional(
                    CONF_UPDATES_PER_DAY, default=DEFAULT_UPDATES_PER_DAY
                ): int,
                vol.Required(
                    CONF_LANGUAGE_KEY, default=get_supported_languages()[0]
                ): vol.In(get_supported_languages()),
                vol.Optional(CONF_IMAGE_SOURCE, default="Yandex"): vol.In(
                    CONDITION_IMAGE.keys()
                ),
            }
        )

        return self.async_show_form(step_id="user", data_schema=schema, errors=errors)


class YandexWeatherOptionsFlow(config_entries.OptionsFlow):
    """Changing options flow."""

    @property
    def config_entry(self):
        return self.hass.config_entries.async_get_entry(self.handler)

    async def async_step_init(self, user_input=None):
        """Manage the options."""
        errors = {}
        if user_input is not None:
            if await _is_online(
                user_input[CONF_API_KEY],
                get_value(self.config_entry, CONF_LATITUDE),
                get_value(self.config_entry, CONF_LONGITUDE),
                self.hass,
            ):
                return self.async_create_entry(title="", data=user_input)
            else:
                errors["base"] = "could_not_get_data"

        return self.async_show_form(
            step_id="init", data_schema=self._get_options_schema(), errors=errors
        )

    def _get_options_schema(self):
        return vol.Schema(
            {
                vol.Required(
                    CONF_API_KEY, default=get_value(self.config_entry, CONF_API_KEY)
                ): str,
                vol.Required(
                    CONF_LANGUAGE_KEY,
                    default=get_value(self.config_entry, CONF_LANGUAGE_KEY),
                ): vol.In(get_supported_languages()),
                vol.Optional(
                    CONF_UPDATES_PER_DAY,
                    default=get_value(
                        self.config_entry, CONF_UPDATES_PER_DAY, DEFAULT_UPDATES_PER_DAY
                    ),
                ): int,
                vol.Optional(
                    CONF_IMAGE_SOURCE,
                    default=get_value(self.config_entry, CONF_IMAGE_SOURCE, "Yandex"),
                ): vol.In(CONDITION_IMAGE.keys()),
            }
        )


async def _is_online(api_key, lat, lon, hass: HomeAssistant) -> bool:
    weather = WeatherUpdater(lat, lon, api_key, hass, "config_flow_test_id")
    await weather.async_request_refresh()
    return weather.last_update_success