"""Product store eligibility checks for release UPCs.""" import asyncio import random from typing import Tuple import config from owsclient import AsyncM2MTokenManager, AsyncOwsClient logger = config.setup_logger(__name__) async_m2m_token_manager = AsyncM2MTokenManager( secrets_manager=config.secrets_manager_client, environment=config.ENVIRONMENT, service_name=config.SERVICE_NAME, ) async_owsclient = AsyncOwsClient( environment=config.ENVIRONMENT, service_name=config.SERVICE_NAME, m2m_token_manager=async_m2m_token_manager if config.ENVIRONMENT != config.TEST_ENVIRONMENT else None, ) async def check_product_eligibility( upc: str, retries: int = 3, backoff_factor: float = 0.5, ) -> Tuple[str, str, str]: """ Fetch eligibility status for a given UPC. Args: upc (str): Product UPC code. retries (int): Number of retry attempts. backoff_factor (float): Base wait time (doubles each retry). Returns: Tuple[str, str, str]: (UPC, status_code or 'ERROR', response_text) """ for attempt in range(retries + 1): try: response = await async_owsclient.get( 'ows-vectororder', path=f'/products/{upc}/eligibility', params={'store_id': config.STORE_ID, 'delivery_type': config.DELIVERY_TYPE}, timeout=config.TIMEOUT, ) if response.status_code >= 500: raise ConnectionError(f'Internal Server Error {response.status_code}') return upc, str(response.status_code), response.text except Exception as e: if attempt < retries: wait_time = backoff_factor * (2 ** attempt) + random.uniform(0, 0.3) logger.warning(f'[UPC {upc}] Attempt {attempt + 1} failed: {e}, retrying...') await asyncio.sleep(wait_time) else: return upc, 'ERROR', repr(e)