o
    ̿SiT                     @   s   d dl Z d dlZd dlZd dlmZ d dlmZmZmZ d dlm	Z	m
Z
mZmZmZ d dlmZ d dlZd dlmZ e eZedZedd	Zed	d
ZeG dd dZG dd dZe ZdS )    N)	dataclass)datetimetime	timedelta)AnyDictListOptionalTuple)ZoneInfo)ZerodhaClientzAsia/Kolkata	         c                   @   s2   e Zd ZU eed< eed< eeeef  ed< dS )_CacheEntrysession_ist_datefetched_at_utccandlesN)	__name__
__module____qualname__str__annotations__r   r   r   r    r   r   </var/www/html/Trade-python/app/v1/services/intraday_store.pyr      s   
 r   c                   @   s   e Zd ZdZdddZddee defddZdede	eeef fd	d
Z
ddee ddfddZddddededededee deeeef  fddZdS )IntradayCandleStorezIn-memory, day-scoped intraday candles.

    Rules enforced:
    - Intraday data is held in memory only.
    - Intraday candles are only for current trading day.
    - Store is flushed when IST day changes.
    - Never persists to DB.
    returnNc                 C   s&   t  | _i | _ttdd| _d S )NINTRADAY_MIN_REFRESH_SECONDS20)	threadingLock_lock_storeintosgetenv_min_refresh_seconds)selfr   r   r   __init__'   s   
zIntradayCandleStore.__init__now_utcc                 C   sr   |pt  }|jtddt}| }| tk r"|t	dd }|
 dkr5|t	dd }|
 dks(| S )NUTCtzinfo   days   )r   utcnowreplacer   
astimezoneISTdater   MARKET_OPEN_ISTr   weekday	isoformat)r'   r)   now_istsession_dater   r   r   _today_ist_key.   s   z"IntradayCandleStore._today_ist_keyc                 C   s   |j tddt}| |}t| }tj|t	td}tj|t
td}| |kr=t	|   kr9t
kr=n n|}|||fS )zReturn (start_ist, end_ist, session_date_key) for intraday candles.

        If we are outside market hours or on a non-trading day, this returns the
        last trading session window.
        r*   r+   )r2   r   r3   r4   r;   r   fromisoformatr5   combiner6   MARKET_CLOSE_ISTr   )r'   r)   r9   session_keyr:   	start_istend_istr   r   r   _session_bounds_ist<   s   
(
z'IntradayCandleStore._session_bounds_istc                 C   s|   |pt  }| |}| j& | j D ]\}}|j|kr+| j   W d    d S qW d    d S 1 s7w   Y  d S N)r   r1   r;   r!   r"   itemsr   clear)r'   r)   today_entr   r   r   flush_if_new_dayP   s   


"z$IntradayCandleStore.flush_if_new_dayd   )max_candlesr)   zerodha_clientinstrument_token	timeframerK   c             	   C   s  |pt  }| | t|pd  }|dvr td| t||f}| |}| j4 | j	
|}	|	r[|	j|kr[||	j  }
|
dkr[|
| jk r[|	j| d  W  d    S W d    n1 sew   Y  | |\}}}|jd d}|jd d}|j||||ddd}|sttdd	}tdtd
|}|dkrt|D ]_}t | tdd }| dkr|tdd }| dkst j|ttd}t j|t td}|jd d}|jd d}z|j||||ddd}W n t!y   g }Y nw |r|" } nqt#$|pg }|j%s't#j&|
ddd|d< |j'dgd(d}|j%s0|)dng }|r<|| d  ng }| j t*|||d| j	|< W d    |S 1 sXw   Y  |S )N >   5minute15minute30minutez Unsupported intraday timeframe: r   r+   F)interval	from_dateto_date
continuousoiINTRADAY_FALLBACK_LOOKBACK_DAYS3   r-   r.   r0   r5   coerce)errors)subsetrecords)r   r   r   )+r   r1   rI   r   striplower
ValueErrorr;   r!   r"   getr   r   total_secondsr&   r   rB   r2   get_historical_data_recordsr#   r$   r%   maxminranger<   r5   r   r7   r=   r6   r4   r>   	Exceptionr8   pd	DataFrameemptyto_datetimedropnasort_valuesto_dictr   )r'   rL   rM   rN   rK   r)   tfkeyr?   rH   ager@   rA   from_dtto_dtrawfallback_daysrG   r:   dfr   r   r   r   get_intraday_candlesZ   s   	

 


z(IntradayCandleStore.get_intraday_candles)r   NrC   )r   r   r   __doc__r(   r	   r   r   r;   r
   rB   rI   r   r#   r   r   r   rx   r   r   r   r   r      s*    
	r   )loggingr$   r   dataclassesr   r   r   r   typingr   r   r   r	   r
   zoneinfor   pandasri   app.v1.services.zerodha.clientr   	getLoggerr   loggerr4   r6   r>   r   r   GLOBAL_INTRADAY_STOREr   r   r   r   <module>   s$    


 
