o
    ͿSi0                     @   s  d dl Z d dlmZmZmZ d dlmZmZmZmZ zd dl	Z
dZW n ey/   dZ
dZY nw d dlmZ d dlmZ d dlmZ d d	lmZ d d
lmZ d dlmZ d dlmZ ddlmZmZ e eZ dedee fddZ!dedee" fddZ#deee$ef  de$deee$ef  fddZ%defddZ&dedee$ef fddZ'de$dee( fdd Z)		d%dede$d!ee$ d"e*dee$ef f
d#d$Z+dS )&    N)datedatetime	timedelta)AnyDictListOptionalTF)HTTPException)ZerodhaClient)IndicatorCalculator)StrategyFeatureCalculator)GLOBAL_INTRADAY_STORE)get_stock_history)refresh_stocks_master   )MAX_CANDLES_PER_TIMEFRAMETEGPT_VERBOSE_LOGSvreturnc                 C   s   | d u rd S t | trt | ts| S t | tr|  S t | tr_|  }|s(d S zt|dd W S  ty^   t|dkr[zt|d d  W  Y S  tyZ   Y Y d S w Y d S w d S )NZz+00:00
   )	
isinstancer   r   strstripfromisoformatreplace	Exceptionlen)r   s r   D/var/www/html/Trade-python/app/v1/services/tegpt/zerodha_services.py_as_date   s.   

r!   c                 C   s8   z| d u s
t | trW d S t| W S  ty   Y d S w N)r   boolfloatr   )r   r   r   r    _num/   s   
r%   dailymodec             
   C   s&  | sg S g }| D ]S}t |tsqt|d}t|d}t|d}t|d}t|d}|du sG|du sG|du sG|du sG|du rHqt|d}	|||||||	d q|s`g S |jd	d
 d i }
g }|D ]D}|d }|dkr| }t	t
|jt
|jd}| }ntt
|jt
|jd}| }||
vrg |
|< || |
| | qng }|D ]Y}|
|pg }|sq|d d }|d d }tdd |D }tdd |D }d}d}|D ]}|ddu rqd}|t|d 7 }q|||||d}|r||d< || q|S )zAggregate daily candles into weekly/monthly candles.

    mode:
      - "week"  => ISO week buckets (week start = Monday)
      - "month" => calendar month buckets (month start = day 1)
    r   openhighlowcloseNvolume)r   r(   r)   r*   r+   r,   c                 S   s   | d S )Nr   r   )xr   r   r    <lambda>T   s    z"_aggregate_ohlcv.<locals>.<lambda>)keyweekr   r   c                 s       | ]}|d  V  qdS )r)   Nr   .0r-   r   r   r    	<genexpr>n       z#_aggregate_ohlcv.<locals>.<genexpr>c                 s   r2   )r*   Nr   r3   r   r   r    r5   o   r6   g        FT)r   r(   r)   r*   r+   )r   dictr!   getr%   appendsortisocalendarr   fromisocalendarintyearr0   	isoformatmonthmaxminr$   )r&   r'   rowsrdohlcr   bucketsorderisostartr/   outbv_sumhas_volr-   candler   r   r    _aggregate_ohlcv8   sj   
(

rS   c                 C   s`   t |d}| d d|i}|stddd|ds#tdd	dt|d
 |d |d dS )z$Get Zerodha client for current user._idzerodha_settingsuser_idi  zZerodha settings not foundstatus_codedetailaccess_tokeni  zZerodha not authenticatedapi_key
api_secret)r[   r\   rZ   )r   r8   find_oner	   r
   )dbcurrent_userrV   settingsr   r   r    get_zerodha_client_service   s   
ra   zerodha_clientc              
   C   s   z(t | |dgdd}t|ddt|dd t|dd |dd	W S  tyD } ztd
 tddt| dd}~ww )zwRefresh stocks master list from Zerodha instruments.

    IMPORTANT: This is the only allowed stock creation path.
    NSET)r^   rb   	exchangesallow_cache_writeinsertedr   updatedkept	timestamp)countri   zFailed to refresh stocks masteri  zStocks master refresh failed: rW   N)r   r=   r8   r   logger	exceptionr	   r   )r^   rb   reser   r   r    refresh_instruments_service   s   >
ro   symbolc                 C   sp   z-|pd   }| d |ddddi}t|tr |dnd}|dur+t|W S dW S  ty7   Y dS w )z:Get instrument token for symbol from `stocks` master list. stocksrc   rp   exchangeinstrument_tokenr   N)r   upperr]   r   r7   r8   r=   r   )r^   rp   symstocktokr   r   r    get_instrument_token   s   rz   
timeframesinclude_quotec                    s>  |t   i i dd ztd| |pd  }|s%d d<  W S d}|durLz|d |dd	p>|d d
|i}W n tyK   d}Y nw t	|t
s\d| d d<  W S |d}|d}| d< | d< |du r|d|  d<  W S |rz| d| g}|d| i  d< W n ty }	 ztd||	 i  d< W Y d}	~	nd}	~	ww g }
|durdd |pg D }d|v sd|v sd|v rzt|t|ddd }
W n ty   g }
Y nw |D ]}zct|pd  }|dv r2|du rg  d |< nF|dkr|
dd  d |< n6|dkr't|
dd d |< n&t|
dd d |< n|dv rGtj| t||dd d |< ng  d |< W q tyo }	 ztd|||	 g  d |< W Y d}	~	qd}	~	ww i }tr d  D ]9\}}|sq{zt|}t|}|r|||< W q{ ty }	 ztd|||	 W Y d}	~	q{d}	~	ww |r| d < trz- d dpg }|rt|}t|}d|i d!< t|}|rd|i d"< W n ty }	 ztd#||	 W Y d}	~	nd}	~	ww ztj di  d"i pi dd$}|r$| d%< W n ty? }	 ztd&||	 W Y d}	~	nd}	~	ww ztt}W n tyR   d'}Y nw |r|d'krz* dpci  D ]\}}t	|t rt!||kr|| d  d |< qfW n
 ty   Y nw  d rt"d(d)  d # D nd'}zt  dpi $ } fd*d+|D }W n ty   i }Y nw t%d,| drd-nd.|t| t&rt%d/|  d s|d'krd0}td1|| | d<  W S  ty }	 zt'd2| t|	 d<  W  Y d}	~	S d}	~	ww )3z-Fetch comprehensive market data for analysis.N)rp   ri   quotecandleserrorz$[teGPT] Market data build start | %srq   zsymbol is requiredr   rr   rc   rs   rp   z'Stock not found in stocks master list: z. Refresh stocks master first.ru   stock_idz3instrument_token missing in stocks master list for zNSE:r}   u!   ❌ Quote fetch failed for %s: %sc                 S   s   h | ]
}t |  qS r   )r   r   lower)r4   tfr   r   r    	<setcomp>   s    z$fetch_market_data.<locals>.<setcomp>dayr0   r@   )r   r0   r@   r~   )r'   )5minute15minute30minuted   )rb   ru   	timeframemax_candlesu%   ❌ Candle fetch failed for %s %s: %su*   ❌ Indicator summary failed for %s %s: %s
indicatorspivotsfibu1   ❌ Pivot/Fibonacci calculation failed for %s: %s)candles_by_timeframer   
strategiesu2   ❌ Strategy feature calculation failed for %s: %sr   c                 s   s    | ]}t |V  qd S r"   )r   )r4   rI   r   r   r    r5   @  r6   z$fetch_market_data.<locals>.<genexpr>c                    s*   i | ]}|t  d pi |pg qS )r~   )r   r8   )r4   kdatar   r    
<dictcomp>C  s   * z%fetch_market_data.<locals>.<dictcomp>z:[teGPT] Zerodha OK | %s | quote=%s | candles=%s | total=%dyesnou!   🎉 ZERODHA DATA COMPLETE for %sz?No market data available from Zerodha (quote and candles empty)u'   ❌ %s for %s - likely auth/token issuezMarket data fetch failed for %s)(r   utcnowr?   rk   debugr   rv   r]   r   r   r7   r8   	get_quoter   r   r   r   rS   r   get_intraday_candlesr=   
_PANDAS_OKitemspd	DataFramer   summarize_dataframecalculate_pivot_pointscalculate_fibonacci_levelsr   summarize_strategiesr   listr   sumvalueskeysinfor   rl   )rb   rp   r{   r^   r|   rx   tokenr   
quote_datarn   day_candles_dbwantr   r   indicators_summary
tf_candlesdf_tfsummaryday_candlesdf_dayr   
fib_levelsr   max_keepseriestotal_candlesr   rh   msgr   r   r    fetch_market_data   s<  	
*








	





(r   )NT),loggingr   r   r   typingr   r   r   r   pandasr   r   r   fastapir	   app.v1.services.zerodha.clientr
   "app.v1.services.zerodha.indicatorsr   )app.v1.services.zerodha.strategy_featuresr   app.v1.services.intraday_storer   app.v1.services.stock_historyr   app.v1.services.stocks_masterr   configr   r   	getLogger__name__rk   r!   r$   r%   r   rS   ra   ro   r=   rz   r#   r   r   r   r   r    <module>   sL    
.	I
