o
    hH                     @   s   d dl Z d dlmZmZ d dlZd dlmZmZmZ dd Zdd Z	d dl
mZmZ d d	lmZ d
d Zdd Zdd Zdd ZdS )    N)datetime	timedelta)
InstrumentKPIKPIValuec                 C   s&   t td|  d }t| S )Nz\d+i  )intresearchgroupr   utcfromtimestampdate)dotnet_date_str	timestamp r   ;/var/www/html/stock_analysis/be/app/utils/datastream_api.pyparse_dotnet_date   s   r   c                 C   sj   d}ddi}t d t d t | t d t | tj|||d}t d t |j t |  | S )	NzMhttps://product.datastream.com/DSWSClient/V1/DSService.svc/rest/GetDataBundlezContent-Typezapplication/jsonz9=============== Request to DataStream API ===============zRequest Body:zRequest Headers:)jsonheadersz4=============== Response Status Code ===============)printrequestspoststatus_coder   )tokenrequest_bodyurlr   responser   r   r   fetch_kpi_data
   s   
r   )rruleMONTHLY)relativedeltac                    s   | dkr+g d} j dd}g }||kr)|j|v r|| |tdd7 }||ks|S | dkr;dd tt |d	D S | d
krP fddt|j j d D S | dkrd fddt|  jd D S t	d)NQ)         
   r!   )daymonthsMc                 S   s   g | ]}|  qS r   )r   ).0dtr   r   r   
<listcomp>'       z'generate_date_range.<locals>.<listcomp>)dtstartuntilYc                    s   g | ]}t  j| d d qS )r!   )r   yearr)   istartr   r   r+   *   s    Dc                    s   g | ]	} t |d  qS )days)r   r1   r3   r   r   r+   -   s    zInvalid frequency)
replacemonthappendr   r   r   ranger0   r7   
ValueError)	frequencyr4   endr'   currentdatesr   r3   r   generate_date_range   s"   

" rA   c                 C   s   | sg S t | } g }| d  }}| dd  D ]E}|dkr$|tdd }n(|dkr0|tdd }n|dkr<|tdd }n|d	krH|tdd
 }ntd||krY|||f |}|}q|||f |S )Nr   r!   r       r&   r(   r/   )yearsr5   r6   zUnsupported frequency)sortedr   r   r<   r:   )r@   r=   rangesr4   prevr   expectedr   r   r   find_continuous_ranges2   s*   rH   c              
   C   s,  | di gd }|r| dr| dstd d S zdd |d D }W n ty@ } ztd|  W Y d }~d S d }~ww |d d d	 d  d
}d }| dg D ]}|d dkrd|d } nqV|d u rotd d S | tj|d }|st|d}| | |   | 	| |d D ]|}	|	d }
|	d	 d }| d}| d}t
|tstd|
 d| d|  q| tj|
d }|st|
d}| | |   | 	| t||D ]-\}}t|sq| tj|j|j||d }|st|j|j||||d}| | qq|   d S )NDataResponsesr   DataTypeValuesDatesu+   ⚠️ No valid KPI data found in response.c                 S   s   g | ]}t |qS r   )r   )r)   dr   r   r   r+   W   r,   z&store_kpi_response.<locals>.<listcomp>u   ❌ Failed to parse dates: SymbolValuesSymbolAdditionalResponsesKey	FrequencyValueu0   ⚠️ Frequency missing in AdditionalResponses.)symbolDataTypeCurrencyu   ⚠️ Skipping KPI 'z' for symbol 'z': invalid data -> )code)instrument_idkpi_idr=   r   )rW   rX   r=   r   valuecurrency)getr   	Exceptionqueryr   	filter_byfirstaddcommitrefresh
isinstancelistr   zip
is_numericr   id)dbresponse_jsondatar@   erS   r=   r
instrumententrykpi_codesymbol_valuevaluesrZ   kpir   rY   existingrecordr   r   r   store_kpi_responseO   s   










ru   c              	   C   s(   zt |  W dS  ttfy   Y dS w )NTF)floatr<   	TypeError)valr   r   r   rf      s   rf   )r   r   r   r   app.db.modelsr   r   r   r   r   dateutil.rruler   r   dateutil.relativedeltar   rA   rH   ru   rf   r   r   r   r   <module>   s    F