"""Вспомогательные функции для настройки HTTP-клиентов."""

from __future__ import annotations

import inspect
import logging
from typing import Any, Dict

import httpx

from .config import settings


logger = logging.getLogger(__name__)
_proxy_reported = False


# ``httpx.Client`` версии 0.28+ принимает параметр ``proxy`` вместо ``proxies``.
_HAS_PROXY_PARAM = "proxy" in inspect.signature(httpx.Client).parameters


def _apply_proxy_settings(options: Dict[str, Any]) -> None:
    """Дополнить словарь параметров сведениями о прокси из конфигурации."""

    global _proxy_reported

    proxy_value = settings.http_proxy
    if proxy_value:
        if _HAS_PROXY_PARAM:
            options["proxy"] = proxy_value
        else:
            options["proxies"] = {
                "http": proxy_value,
                "https": proxy_value,
            }
        if not _proxy_reported:
            logger.info("Используется HTTP(S)-прокси: %s", proxy_value)
    else:
        if not _proxy_reported:
            logger.debug(
                "HTTP(S)-прокси в конфигурации не задан; соединение выполняется напрямую"
            )

    if settings.http_proxy_skip_verify:
        options["verify"] = False

    _proxy_reported = True


def build_http_client_options(
    *, timeout: float | httpx.Timeout | None = 60.0, **overrides: Any
) -> Dict[str, Any]:
    """Сформировать словарь параметров HTTP-клиента с учётом прокси."""

    client_options: Dict[str, Any] = {}
    if timeout is not None:
        client_options["timeout"] = (
            httpx.Timeout(timeout) if isinstance(timeout, (int, float)) else timeout
        )
    _apply_proxy_settings(client_options)
    client_options.update(overrides)
    return client_options


def build_sync_http_client(timeout: float = 60.0, **overrides: Any) -> httpx.Client:
    """Создать синхронный ``httpx.Client`` с учётом настроек прокси."""

    client_options = build_http_client_options(timeout=timeout, **overrides)
    return httpx.Client(**client_options)
