"""Config flow for Flipr integration."""

from __future__ import annotations

import logging
from typing import Any

from flipr_api import FliprAPIRestClient
from requests.exceptions import HTTPError, Timeout
import voluptuous as vol

from homeassistant.config_entries import ConfigFlow, ConfigFlowResult
from homeassistant.const import CONF_EMAIL, CONF_PASSWORD

from .const import DOMAIN

_LOGGER = logging.getLogger(__name__)

DATA_SCHEMA = vol.Schema(
    {
        vol.Required(CONF_EMAIL): str,
        vol.Required(CONF_PASSWORD): str,
    }
)


class FliprConfigFlow(ConfigFlow, domain=DOMAIN):
    """Handle a config flow for Flipr."""

    VERSION = 2

    async def async_step_user(
        self, user_input: dict[str, Any] | None = None
    ) -> ConfigFlowResult:
        """Handle the initial step."""

        errors: dict[str, str] = {}

        if user_input is not None:
            client = FliprAPIRestClient(
                user_input[CONF_EMAIL], user_input[CONF_PASSWORD]
            )

            try:
                ids = await self.hass.async_add_executor_job(client.search_all_ids)
            except HTTPError:
                errors["base"] = "invalid_auth"
            except (Timeout, ConnectionError):
                errors["base"] = "cannot_connect"
            except Exception:
                errors["base"] = "unknown"
                _LOGGER.exception("Unexpected exception")

            else:
                _LOGGER.debug("Found flipr or hub ids : %s", ids)

                if len(ids["flipr"]) > 0 or len(ids["hub"]) > 0:
                    # If there is a flipr or hub, we can create a config entry.

                    await self.async_set_unique_id(user_input[CONF_EMAIL])
                    self._abort_if_unique_id_configured()

                    return self.async_create_entry(
                        title=f"Flipr {user_input[CONF_EMAIL]}",
                        data=user_input,
                    )

                # if no flipr or hub found. Tell the user with an error message.
                errors["base"] = "no_flipr_id_found"

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