
    hH                     x    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 Zd Z	d dl
mZmZ d dlmZ d Zd	 Zd
 Zd Zy)    N)datetime	timedelta)
InstrumentKPIKPIValuec                     t        t        j                  d|       j                               dz  }t	        j
                  |      j                         S )Nz\d+i  )intresearchgroupr   utcfromtimestampdate)dotnet_date_str	timestamps     W/home/user/Documents/projects/stock_analysis/stock_analysis/app/utils/datastream_api.pyparse_dotnet_dater      s?    BIIfo6<<>?$FI$$Y/4466    c                 >   d}ddi}t        d       t        d       t        |       t        d       t        |       t        j                  |||      }t        d       t        |j                         t        |j	                                |j	                         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   responses        r   fetch_kpi_datar   
   s~    
YC12G	
EF	/	,	
	'N}}S|WEH	
@A	(

	(--/==?r   )rruleMONTHLY)relativedeltac                 b   | dk(  rSg d}|j                  d      }g }||k  r4|j                  |v r|j                  |       |t        d      z  }||k  r4|S | dk(  r.t	        t
        ||      D cg c]  }|j                          c}S | dk(  rKt        |j                  |j                  z
  dz         D cg c]  }t        |j                  |z   dd       c}S | d	k(  r6t        ||z
  j                  dz         D cg c]  }|t        |
      z    c}S t        d      c c}w c c}w c c}w )NQ)         
   r%   )daymonthsM)dtstartuntilYDdayszInvalid frequency)replacemonthappendr"   r    r!   r   rangeyearr2   r   
ValueError)	frequencystartendr+   currentdatesdtis           r   generate_date_ranger@      s5   C--A-&n}}&W%}A..G n 	c	$)'5$LM$Lb	$LMM	c	49#((UZZ:ORS:S4TU4TqUZZ!^Q*4TUU	c	38#+9K9Ka9O3PQ3Pa	q))3PQQ ,-- N V Rs   2D"8!D'>D,c                 f   | sg S t        |       } g }| d   x}}| dd  D ]}  }|dk(  r|t        d      z   }nJ|dk(  r|t        d      z   }n5|dk(  r|t        d      z   }n |d	k(  r|t        d
      z   }nt        d      ||k7  r|j	                  ||f       |}|} |j	                  ||f       |S )Nr   r%   r$      r*   r,   r/   )yearsr0   r1   zUnsupported frequency)sortedr"   r   r8   r5   )r=   r9   rangesr:   prevr   expecteds          r   find_continuous_rangesrH   2   s    	5MEF8EDab	m155H#m155H#m!44H#iQ//H4558MM5$-(E! $ MM5$- Mr   c           
         |j                  di g      d   }|r"|j                  d      r|j                  d      st        d       y 	 |d   D cg c]  }t        |       }}|d   d   d   d   j                  d      }d }|j                  d	g       D ]  }|d
   dk(  s|d   } n |t        d       y | j	                  t
              j                  |      j                         }	|	s>t        |      }	| j                  |	       | j                          | j                  |	       |d   D ]m  }
|
d   }|
d   d   }|j                  d      }|j                  d      }t        |t              st        d| d| d|        X| j	                  t              j                  |      j                         }|s>t        |      }| j                  |       | j                          | j                  |       t        ||      D ]  \  }}t        |      s| j	                  t               j                  |	j"                  |j"                  ||      j                         }|r_t!        |	j"                  |j"                  ||||      }| j                  |        p | j                          y c c}w # t        $ r}t        d|        Y d }~y d }~ww xY w)NDataResponsesr   DataTypeValuesDatesu+   ⚠️ No valid KPI data found in response.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_idr9   r   )rW   rX   r9   r   valuecurrency)getr   r   	Exceptionqueryr   	filter_byfirstaddcommitrefresh
isinstancelistr   zip
is_numericr   id)dbresponse_jsondatadr=   erS   r9   r
instrumententrykpi_codesymbol_valuevaluesrZ   kpir   rY   existingrecords                       r   store_kpi_responserv   O   s   _rd3A6Dtxx 01'9J;</3G}=}!"1%}=
 "#A&~6q9==hGFIXX+R0U8{"'
I 1 @A*%//v/>DDFJv.

z
		


:&'$^,Q/!!'*##J/ &$')(>&I\]c\defhhsm%%8%4::<8$CFF3KIIKJJsOuf-KD%e$xx)33(mmvv#	 4 
 eg  !",--66'% v' .% (L IIKy > +A3/0s*   J5 J0!J5 0J5 5	K>KKc                 F    	 t        |        y# t        t        f$ r Y yw xY w)NTF)floatr8   	TypeError)vals    r   rf   rf      s(    c
	" s      )r   r   r   r
   app.db.modelsr   r   r   r   r   dateutil.rruler    r!   dateutil.relativedeltar"   r@   rH   rv   rf    r   r   <module>r      s<     ( 	 3 37 * 0..:DLr   