"""Common test tools."""
from __future__ import annotations

from collections.abc import AsyncGenerator
from typing import Awaitable, Callable, cast

import pytest

from homeassistant.components.recorder import Recorder
from homeassistant.components.recorder.const import DATA_INSTANCE
from homeassistant.core import HomeAssistant
from homeassistant.helpers.typing import ConfigType

from .common import async_recorder_block_till_done

from tests.common import (
    async_init_recorder_component,
    get_test_home_assistant,
    init_recorder_component,
)

SetupRecorderInstanceT = Callable[..., Awaitable[Recorder]]


@pytest.fixture
def hass_recorder():
    """Home Assistant fixture with in-memory recorder."""
    hass = get_test_home_assistant()

    def setup_recorder(config=None):
        """Set up with params."""
        init_recorder_component(hass, config)
        hass.start()
        hass.block_till_done()
        hass.data[DATA_INSTANCE].block_till_done()
        return hass

    yield setup_recorder
    hass.stop()


@pytest.fixture
async def async_setup_recorder_instance() -> AsyncGenerator[
    SetupRecorderInstanceT, None
]:
    """Yield callable to setup recorder instance."""

    async def async_setup_recorder(
        hass: HomeAssistant, config: ConfigType | None = None
    ) -> Recorder:
        """Setup and return recorder instance."""  # noqa: D401
        await async_init_recorder_component(hass, config)
        await hass.async_block_till_done()
        instance = cast(Recorder, hass.data[DATA_INSTANCE])
        await async_recorder_block_till_done(hass, instance)
        assert isinstance(instance, Recorder)
        return instance

    yield async_setup_recorder