"""Test utilities."""
from collections.abc import Awaitable, Callable

from aiohttp.web import Application, Request, StreamResponse, middleware


def mock_real_ip(app: Application) -> Callable[[str], None]:
    """Inject middleware to mock real IP.

    Returns a function to set the real IP.
    """
    ip_to_mock: str | None = None

    def set_ip_to_mock(value: str):
        nonlocal ip_to_mock
        ip_to_mock = value

    @middleware
    async def mock_real_ip(
        request: Request, handler: Callable[[Request], Awaitable[StreamResponse]]
    ) -> StreamResponse:
        """Mock Real IP middleware."""
        nonlocal ip_to_mock

        request = request.clone(remote=ip_to_mock)

        return await handler(request)

    async def real_ip_startup(app):
        """Startup of real ip."""
        app.middlewares.insert(0, mock_real_ip)

    app.on_startup.append(real_ip_startup)

    return set_ip_to_mock