"""Delivery provider registry and wiring.""" from dataclasses import dataclass from typing import Mapping, Sequence import httpx from app.adapters.delivery_providers.base import ( DeliveryProvider, OrderRegistrationProvider, PaymentPriceValidationProvider, ) from app.adapters.delivery_providers.cdek import CDEKProvider from app.adapters.delivery_providers.cse import CSEProvider from app.config import DeliveryProvidersConfig @dataclass(frozen=True, slots=True) class DeliveryProviderRegistry: providers: Sequence[DeliveryProvider] payment_price_validation_adapters: Mapping[str, PaymentPriceValidationProvider] order_registration_adapters: Mapping[str, OrderRegistrationProvider] def resolve_delivery_provider_timeout_seconds( config: DeliveryProvidersConfig, ) -> float: timeouts = [ provider_config.timeout_seconds for provider_config in (config.cdek, config.cse) if provider_config.enabled ] return max(timeouts, default=10.0) def build_delivery_provider_registry( *, http_client: httpx.AsyncClient, config: DeliveryProvidersConfig, ) -> DeliveryProviderRegistry: providers: list[DeliveryProvider] = [] payment_price_validation_adapters: dict[str, PaymentPriceValidationProvider] = {} order_registration_adapters: dict[str, OrderRegistrationProvider] = {} if config.cdek.enabled: cdek_provider = CDEKProvider.from_config( http_client=http_client, config=config.cdek, ) providers.append(cdek_provider) payment_price_validation_adapters[cdek_provider.name] = cdek_provider order_registration_adapters[cdek_provider.name] = cdek_provider if config.cse.enabled: cse_provider = CSEProvider.from_config( http_client=http_client, config=config.cse, ) providers.append(cse_provider) payment_price_validation_adapters[cse_provider.name] = cse_provider order_registration_adapters[cse_provider.name] = cse_provider return DeliveryProviderRegistry( providers=tuple(providers), payment_price_validation_adapters=payment_price_validation_adapters, order_registration_adapters=order_registration_adapters, )