"""Helpers for HomeWizard."""
from __future__ import annotations

from collections.abc import Callable, Coroutine
from typing import Any, Concatenate, ParamSpec, TypeVar

from homewizard_energy.errors import DisabledError, RequestError

from homeassistant.exceptions import HomeAssistantError

from .entity import HomeWizardEntity

_HomeWizardEntityT = TypeVar("_HomeWizardEntityT", bound=HomeWizardEntity)
_P = ParamSpec("_P")


def homewizard_exception_handler(
    func: Callable[Concatenate[_HomeWizardEntityT, _P], Coroutine[Any, Any, Any]]
) -> Callable[Concatenate[_HomeWizardEntityT, _P], Coroutine[Any, Any, None]]:
    """Decorate HomeWizard Energy calls to handle HomeWizardEnergy exceptions.

    A decorator that wraps the passed in function, catches HomeWizardEnergy errors,
    and reloads the integration when the API was disabled so the reauth flow is
    triggered.
    """

    async def handler(
        self: _HomeWizardEntityT, *args: _P.args, **kwargs: _P.kwargs
    ) -> None:
        try:
            await func(self, *args, **kwargs)
        except RequestError as ex:
            raise HomeAssistantError from ex
        except DisabledError as ex:
            await self.hass.config_entries.async_reload(
                self.coordinator.config_entry.entry_id
            )
            raise HomeAssistantError from ex

    return handler