a
    5hN                     @   s   d dl Z d dlmZ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date)
InstrumentKPIKPIValuec                 C   s&   t td|  d }t| S )Nz\d+i  )intresearchgroupr   utcfromtimestampr   )Zdotnet_date_str	timestamp r   ?/var/www/html/stockanalysis-backend/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   )tokenZrequest_bodyurlr   responser   r   r   fetch_kpi_data
   s    
r   )rruleMONTHLY)relativedeltac                    s   | dkrPg d} j dd}g }||krL|j|v r<|| |tdd7 }q |S | dkrpdd tt |d	D S | d
kr fddt|j j d D S | dkr fddt|  jd D S t	dd S )NQ)         
   r   )daymonthsMc                 S   s   g | ]}|  qS r   )r   ).0dtr   r   r   
<listcomp>'       z'generate_date_range.<locals>.<listcomp>)ZdtstartZuntilYc                    s   g | ]}t  j| d d qS )r   )r   yearr'   istartr   r   r)   *   r*   Dc                    s   g | ]} t |d  qS )days)r   r-   r/   r   r   r)   -   r*   zInvalid frequency)
replacemonthappendr   r   r   ranger,   r3   
ValueError)	frequencyr0   endr%   currentdatesr   r/   r   generate_date_range   s     

" r=   c                 C   s   | sg S t | } g }| d  }}| dd  D ]}|dkrH|tdd }nP|dkr`|tdd }n8|dkrx|tdd }n |d	kr|tdd
 }ntd||kr|||f |}|}q,|||f |S )Nr   r   r      r$   r&   r+   )Zyearsr1   r2   zUnsupported frequency)sortedr   r   r8   r6   )r<   r9   rangesr0   prevr   expectedr   r   r   find_continuous_ranges2   s*    rC   c              
   C   s>  | di gd }|r*| dr*| ds6td d S zdd |d D }W n4 ty } ztd|  W Y d }~d S d }~0 0 |d d d	 d  d
}d }| dg D ]}|d dkr|d } qq|d u rtd d S | tj|d }|s t|d}| | |   | 	| |d D ]}	|	d }
|	d	 d }| d}| d}t
|tstd|
 d| d|  q(| tj|
d }|st|
d}| | |   | 	| t||D ]`\}}t|sq| tj|j|j||d }|st|j|j||||d}| | q̐q(|   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SymbolZAdditionalResponsesZKey	FrequencyValueu0   ⚠️ Frequency missing in AdditionalResponses.)symbolDataTypeCurrencyu   ⚠️ Skipping KPI 'z' for symbol 'z': invalid data -> )code)instrument_idkpi_idr9   r   )rP   rQ   r9   r   valuecurrency)getr   	Exceptionqueryr   	filter_byfirstaddcommitrefresh
isinstancelistr   zip
is_numericr   id)dbZresponse_jsondatar<   erL   r9   r
instrumententrykpi_codeZsymbol_valuevaluesrS   kpir   rR   existingrecordr   r   r   store_kpi_responseO   st    










rl   c              	   C   s,   zt |  W dS  ttfy&   Y dS 0 d S )NTF)floatr8   	TypeError)valr   r   r   r_      s
    r_   )r   r   r   r   r	   app.db.modelsr   r   r   r   r   Zdateutil.rruler   r   Zdateutil.relativedeltar   r=   rC   rl   r_   r   r   r   r   <module>   s   F