o
    dtwi/                     @   s   d dl Z d dlZd dlZd dlZd dlZd dlmZ d dlZe 	e
ZejejejeddZdd Zdd Zed	d
ddddZdddZdd ZdS )    N)retry..zsettings.jsonc                 C   s6   t | trt| dks|  std|   dS dS )N
   zInvalid ASIN format: FT)
isinstancestrlenisalnumloggererror)asin r   0/var/www/agentarbitrage/keepa_deals/keepa_api.pyvalidate_asin   s   r   c              
   C   s   t d d|  }ddi}ztj||dd}|  | }t d|  |W S  tjjyF } zt d|  W Y d	}~d	S d	}~w t	y` } zt d
|  W Y d	}~d	S d	}~ww )zQ
    Makes a request to the /token endpoint to get the current token status.
    z-Requesting current token status from Keepa...z https://api.keepa.com/token?key=
User-Agent>Mozilla/5.0 (Windows NT 10.0; Win64; x64) Chrome/90.0.4430.212   headerstimeoutz%Successfully retrieved token status: zFailed to get token status: Nz9An unexpected error occurred while getting token status: )
r	   inforequestsgetraise_for_statusjson
exceptionsRequestExceptionr
   	Exception)api_keyurlr   responsedataer   r   r   get_token_status   s$   

r"      i  )stop_max_attempt_number
wait_fixedF   c                 C   sd  t | } t |}td|  d|  |r td |jdd tjtjtjt	dd}z!t
|d}t|}W d	   n1 sFw   Y  td
 W n^ ttjfy   td i d| dddg ddgddgdddgdddgdddgdddgd dd!d"d#d"d$d"d%d"d&d'd(d)d*d)d"d)d"d"d"d"|d+g d,d-	}Y nw | |d< ||d.< tj|d/d)d0}tj|}	d1| d2|	 }
d3d4i}z;tj|
|d5d6}|  | }|d7i d8g }|d9d:}|d;}td<t| d=| d>|  |||fW S  tjjy } zx|jr |jjnd	}d:}d	}|jd	urWz|j }|d9d:}|d;}|rJ|d	urJ|| W n tjyV   Y nw |d?ksd|ro|d@krotdA| dB |tdC|pvdD dE|jr|jjn|  d	||fW  Y d	}~S d	}~w ty } ztdFt |  W Y d	}~dGS d	}~ww )Hac  
    Fetches deals from the Keepa API using a fixed, user-provided query.
    The `use_deal_settings` parameter is ignored to ensure stability.
    Accepts a page number and a sort_type.
    Optional: token_manager instance to handle rate limiting and token bucket waits.
    Returns the response data, tokens consumed, and the number of tokens left.
    z4Executing fetch_deals_for_deals (v_fix_sort). Page: z, Sort: zJTokenManager provided. Checking/Waiting for tokens before Deal API call...r   )estimated_costr   zkeepa_query.jsonrNz'Using Keepa query from keepa_query.jsonzFkeepa_query.json not found or invalid. Using hardcoded fallback query.pagedomainId1excludeCategoriesincludeCategoriesiR 
priceTypes   
deltaRangei  i&  deltaPercentRange2   isalesRankRangeiP  i` currentRangei  iu  	minRatingisLowestF
isLowest90isLowestOfferisOutOfStocktitleSearch isRangeEnabledTisFilterEnabledr#   )r/   r#   r&      )	filterEroticsingleVariation
hasReviewsisPrimeExclusivemustHaveAmazonOffermustNotHaveAmazonOffersortType	dateRangewarehouseConditionsrE   ),:)
separators	sort_keyszhttps://api.keepa.com/deal?key=z&selection=r   r   <   r   dealsdrtokensConsumedr   
tokensLeftzFetched z deals. Tokens consumed: . Tokens left:   i  z'Deal fetch failed with retryable error z!. Re-raising for retry decorator.zDeal fetch failed: N/Az, zDeal fetch exception: )Nr   N)!intr	   r   request_permission_for_callospathjoindirnameabspath__file__openr   loadFileNotFoundErrorJSONDecodeErrorwarningdumpsurllibparsequoter   r   r   r   r   r   r   status_codeupdate_after_callr
   textr   r   )r)   r   use_deal_settings	sort_typetoken_managerKEEPA_QUERY_FILEf
deal_query
query_jsonencoded_selectionr   r   r   r    rM   tokens_consumedtokens_leftr!   re   
error_datar   r   r   fetch_deals_for_deals*   s   

 

 !"9
 


,rs   m        c                 C   sJ  |st d dddiddfS t dt| dd|dd	  d
 d|}d|  d| d| d| d| d| d| d}ddi}z1tj||dd}	|	  |	 }
|
dd}|
d}t d| d|  ddi}|
|||fW S  tj	j
y } zp|jdur|jjnd}t dd|dd	  d| dt|  d}d}|jdurz!|j }|dd}|d}|dkrt d | d!|  W n tjy   t d"| d# Y nw d|i}d|||fW  Y d}~S d}~w ty$ } z$t d$d|dd	  d%t|  dd&i}d|ddfW  Y d}~S d}~ww )'z
    Fetches a batch of products from the Keepa API.
    Returns the response data, API info, tokens consumed, and tokens left.
    Optimized for the upserter task by default.
    z7fetch_product_batch called with an empty list of ASINs.Nerror_status_codeEMPTY_ASIN_LISTr   zFetching batch of z ASINs: rH   r#   z...z"https://api.keepa.com/product?key=z&domain=1&asin=z&stats=z&days=z&offers=z&rating=z	&history=z&only_live_offers=1r   r   x   r   rO   rP   z,Batch API call successful. Tokens consumed: rQ   rS   z"HTTP Fetch failed for batch ASINs z... with status : rR   z429 ERROR. Keepa reported z4 tokens consumed for this failed call. Tokens left: HTTP error response (status ) was not valid JSON.z%Generic Fetch failed for batch ASINs z...: GENERIC_SCRIPT_ERROR)r	   r`   r   r   rX   r   r   r   r   r   r   r   re   r
   r   r_   r   )r   
asins_listdaysoffersratinghistorycomma_separated_asinsr   r   r   r    rp   rq   api_infor!   re   tokens_consumed_on_errortokens_left_on_errorrr   api_info_on_errorr   r   r   fetch_product_batch   sR   
*
0
.


(r   c                 C   s  |st d dddiddfS t|dkr(t dt| d ddd	iddfS d
|}t dt| d d|  d| }ddi}z1tj||dd}|  |	 }|dd}|d}t d| d|  ddi}	||	||fW S  tj
jy }
 zd|
jdur|
jjnd}t d| d|
  d}d}|
jdurz!|
j	 }|dd}|d}|dkrt d| d|  W n t	jy   t d| d Y nw d|i}d|||fW  Y d}
~
S d}
~
w ty }
 zt jd|
 d d! dd"i}d|ddfW  Y d}
~
S d}
~
ww )#z
    Fetches data for a list of sellers from the Keepa API.
    Returns the response data, API info, tokens consumed, and tokens left.
    z,fetch_seller_data called with no seller_ids.Nrw   EMPTY_SELLER_ID_LISTr   d   z)fetch_seller_data called with a batch of z which is over the 100 limit.BATCH_SIZE_EXCEEDEDrH   zFetching data for batch of z sellersz!https://api.keepa.com/seller?key=z&domain=1&seller=r   r   rL   r   rO   rP   z-Seller API call successful. Tokens consumed: rQ   rS   z/HTTP fetch failed for seller batch with status rz   rR   z*429 ERROR on seller batch. Keepa reported z tokens consumed. Tokens left: r{   r|   z9An unexpected error occurred while fetching seller data: T)exc_infor}   )r	   r`   r   r
   rX   r   r   r   r   r   r   r   r   re   r_   r   )r   
seller_idsseller_ids_strr   r   r   r    rp   rq   r   r!   re   r   r   rr   r   r   r   r   fetch_seller_data   sX   





r   )Fr&   N)rt   ru   rv   r   )loggingr   r   rV   urllib.parserb   retryingr   time	getLogger__name__r	   rW   rX   rY   rZ   r[   SETTINGS_PATHr   r"   rs   r   r   r   r   r   r   <module>   s    
 
 
5