a
    Yh                  	   @   s  d dl mZmZmZ d dlmZ d dlmZmZ d dlm	Z	 d dl
mZ d dlmZmZ d dlmZmZmZmZmZ d dlmZmZmZ d d	lmZ d d
lmZ d dlmZ d dlZej j!j"ej#d e Z$e$%ej& e$j'edgddgdgd dd Z(e$)dee(fe*e*e*e*e*edddZ+e$,dedededee(fe*e*e*e*edddZ-e$,dee(feddd Z.e$,d!edee(fe*ed"d#d$Z/e$,d%d&d' Z0dS )(    )FastAPIDependsQuery)List)datetime	timedelta)and_)Session)modelsdatabase)fetch_kpi_dataparse_dotnet_dategenerate_date_rangefind_continuous_rangesstore_kpi_response)
InstrumentKPIKPIValue)SessionLocal)CORSMiddleware)admin_routesN)bind*T)Zallow_originsZallow_credentialsZallow_methodsZallow_headersc                  c   s*   t  } z| V  W |   n
|   0 d S )N)r   r   closedb r   (/var/www/html/stock_analysis/app/main.pyget_db   s    r   z/fetch-kpis/)token	frequencysymbol
start_dateend_dater   c              
   C   s  dd | tj D }| ddidd |D |||dd|ddid	d
dgd}t| |}td t| |d d }	dd |	d D }
|	d d d d d }| tjj|d }|stj|d}|	| |
  || |	d D ]}|d }|d d d }|d d d}| tjj|d }|sdtj|d}|	| |
  || t|
|D ]d\}}|d u rqn| tjj|j|j||d }|sntj|j|j||||d}|	| qnq|
  ddiS )Nc                 S   s   g | ]
}|j qS r   code.0kr   r   r   
<listcomp>&       zfetch_kpis.<locals>.<listcomp>RequestAllMetadataTc                 S   s   g | ]}|d didqS 
ReturnNameTValue
Propertiesr   r'   r%   r   r   r   r)   ,   r*      ZStartZEndZ	FrequencyZKindr-   r.    Z	DataTypesDater   ZTagZ
TokenValuer0   ZDataRequestsz<=============== Response from DataStream API ===============ZDataResponsesr   c                 S   s   g | ]}t |qS r   )r   r'   dr   r   r   r)   @   r*   ZDatesZDataTypeValuesZSymbolValuesZSymbolr!   ZDataTyper/   ZCurrencyr$   )instrument_idkpi_idr    date)r;   r<   r    r=   valuecurrencymessagezKPI data fetched and stored.)queryr
   r   allr   printr   	filter_byfirstaddcommitrefreshgetzipr   id)r   r    r!   r"   r#   r   	kpi_codesbodyresponsedatadatesZinstrument_symbol
instrumententryZkpi_codevaluesr?   kpir=   r>   existingZkpi_valr   r   r   
fetch_kpis#   sv    






rV   z/kpis/Q.)r!   r    r"   r#   r   c              	      s  t d}t|d }t|d }dd |tj D }|t	j
| d }	|	st	| d}	||	 |  ||	 |tjtj|	jktj|ktj|ktj|k  }
dd |
D  t|||}t fdd|D }|rbt|}|D ]`\}}|d	d
idd |D | | |dd| dd
idddgd}t||}t|| q i }|D ]}|tj
|d }|sqj|ttj|	jktj|jktj|ktj|ktj|ktj }dd |D ||j< qj| |t|t||dS )NZDATASTREAM_API_TOKENz%Y-%m-%dc                 S   s   g | ]
}|j qS r   r$   r&   r   r   r   r)   }   r*   zget_kpis.<locals>.<listcomp>r:   c                 S   s   h | ]}|d  qS )r   r   r8   r   r   r   	<setcomp>   r*   zget_kpis.<locals>.<setcomp>c                    s   g | ]}| vr|qS r   r   r8   Zexisting_datesr   r   r)      r*   r+   Tc                 S   s   g | ]}|d didqS r,   r   r1   r   r   r   r)      r*   r2   r3   r-   r.   r4   r5   r7   r$   c                 S   s"   g | ]}t |j|j|jd qS ))r=   r>   r?   )strr=   r>   r?   )r'   rr   r   r   r)      s
   )r!   r    r"   r#   kpis)osgetenvr   strptimer=   rA   r
   r   rB   r   rD   rE   rF   rG   rH   r   filterr;   rK   r    Zdistinctr   sortedr   	isoformatr   r   r<   Zorder_bynamerZ   )r!   r    r"   r#   r   r   startendrL   rQ   Zdb_datesZ
full_rangeZmissing_dateschunksZchunk_startZ	chunk_endrM   rN   Zkpi_datar%   rT   recordsr   rY   r   get_kpisn   sz    









rh   z/kpi-options/r   c                 C   s   |  t }dd |D S )Nc                 S   s    g | ]}|j |jp|j d qS )r%   rc   ri   r&   r   r   r   r)      r*   z#get_kpi_options.<locals>.<listcomp>)rA   r   rB   )r   r\   r   r   r   get_kpi_options   s    rj   z/symbol-search/)rA   r   c                 C   s8   | ttjd|  dd }dd |D S )N%
   c                 S   s   g | ]}|j |jd qS )r!   rc   rm   )r'   ir   r   r   r)      r*   z!symbol_search.<locals>.<listcomp>)rA   r   r`   r!   ZilikelimitrB   )rA   r   resultsr   r   r   symbol_search   s    
rq   z/routesc                   C   s   dd t jD S )Nc                 S   s   g | ]
}|j qS r   )path)r'   router   r   r   r)      r*   zlist_routes.<locals>.<listcomp>)appZroutesr   r   r   r   list_routes   s    ru   )1Zfastapir   r   r   typingr   r   r   Z
sqlalchemyr   Zsqlalchemy.ormr	   Zapp.dbr
   r   Zapp.utils.datastream_apir   r   r   r   r   Zapp.db.modelsr   r   r   Zapp.db.databaser   Zfastapi.middleware.corsr   Zapp.apir   r]   ZBasemetadataZ
create_allZenginert   Zinclude_routerZrouterZadd_middlewarer   postrZ   rV   rI   rh   rj   rq   ru   r   r   r   r   <module>   sT   "J[ 	