"""Adds config flow for Brottsplatskartan integration."""
from __future__ import annotations

from typing import Any
import uuid

import voluptuous as vol

from homeassistant import config_entries
from homeassistant.const import CONF_LATITUDE, CONF_LOCATION, CONF_LONGITUDE
from homeassistant.data_entry_flow import FlowResult
from homeassistant.helpers import selector

from .const import AREAS, CONF_APP_ID, CONF_AREA, DEFAULT_NAME, DOMAIN

DATA_SCHEMA = vol.Schema(
    {
        vol.Optional(CONF_LOCATION): selector.LocationSelector(
            selector.LocationSelectorConfig(radius=False, icon="")
        ),
        vol.Optional(CONF_AREA, default="none"): selector.SelectSelector(
            selector.SelectSelectorConfig(
                options=AREAS,
                mode=selector.SelectSelectorMode.DROPDOWN,
                translation_key="areas",
            )
        ),
    }
)


class BPKConfigFlow(config_entries.ConfigFlow, domain=DOMAIN):
    """Handle a config flow for Brottsplatskartan integration."""

    VERSION = 1

    async def async_step_import(self, config: dict[str, Any]) -> FlowResult:
        """Import a configuration from config.yaml."""

        if config.get(CONF_LATITUDE):
            config[CONF_LOCATION] = {
                CONF_LATITUDE: config[CONF_LATITUDE],
                CONF_LONGITUDE: config[CONF_LONGITUDE],
            }
        if not config.get(CONF_AREA):
            config[CONF_AREA] = "none"
        else:
            config[CONF_AREA] = config[CONF_AREA][0]

        return await self.async_step_user(user_input=config)

    async def async_step_user(
        self, user_input: dict[str, Any] | None = None
    ) -> FlowResult:
        """Handle the user step."""
        errors: dict[str, str] = {}

        if user_input is not None:
            latitude: float | None = None
            longitude: float | None = None
            area: str | None = (
                user_input[CONF_AREA] if user_input[CONF_AREA] != "none" else None
            )

            if area:
                name = f"{DEFAULT_NAME} {area}"
            elif location := user_input.get(CONF_LOCATION):
                lat: float = location[CONF_LATITUDE]
                long: float = location[CONF_LONGITUDE]
                latitude = lat
                longitude = long
                name = f"{DEFAULT_NAME} {round(latitude, 2)}, {round(longitude, 2)}"
            else:
                latitude = self.hass.config.latitude
                longitude = self.hass.config.longitude
                name = f"{DEFAULT_NAME} HOME"

            app = f"ha-{uuid.getnode()}"

            self._async_abort_entries_match(
                {CONF_AREA: area, CONF_LATITUDE: latitude, CONF_LONGITUDE: longitude}
            )
            return self.async_create_entry(
                title=name,
                data={
                    CONF_LATITUDE: latitude,
                    CONF_LONGITUDE: longitude,
                    CONF_AREA: area,
                    CONF_APP_ID: app,
                },
            )

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