o
    ͿSi                  	   @   s  d dl Z d dlmZ d dlmZmZ d dlmZmZ eddG dd dZd	e	d
e	de	fddZ
de	d
eeef deeef fddZde	fddZdefddZdefddZdee de	defddZdedededefddZd5dee defd d!Zd5dee defd"d#Zd5dee defd$d%Zdede	fd&d'Zd5dee de	fd(d)Zd5dee dee fd*d+Zd5dee defd,d-Zd.d/d0ed1ed2edefd3d4ZdS )6    N)	dataclass)datetime	timedelta)OptionalTupleT)frozenc                   @   sJ   e Zd ZU eed< eed< eed< eed< defddZdefdd	Zd
S )
TimeWindowstart_hstart_mend_hend_mreturnc                 C      | j d | j S N<   )r	   r
   self r   6/var/www/html/Trade-python/app/v1/utils/market_time.pystart_minutes      zTimeWindow.start_minutesc                 C   r   r   )r   r   r   r   r   r   end_minutes   r   zTimeWindow.end_minutesN)__name__
__module____qualname__int__annotations__r   r   r   r   r   r   r      s   
 r   namedefaultr   c                 C   s.   t | }|d u r|S t| }|r|S |S N)osgetenvstrstrip)r   r   rawsr   r   r   _env_str   s
   
r&   valuec                 C   s   z=| pd  }|s|W S |d}t|dkr|W S t|d }t|d }|dk s6|dks6|dk s6|dkr9|W S ||fW S  tyH   | Y S w )N :   r         ;   )r#   splitlenr   	Exception)r'   r   r%   partshmr   r   r   _parse_hhmm   s   
 
r4   c                   C   s
   t ddS )N	MARKET_TZzAsia/Kolkata)r&   r   r   r   r   market_tz_name.   s   
r6   c                  C   8   t tddd\} }t tddd\}}t| |||dS )NBACKEND_MARKET_STARTz09:00)	   r   BACKEND_MARKET_ENDz15:30)      r	   r
   r   r   r4   r&   r   shsmehemr   r   r   backend_market_window2      rD   c                  C   r7   )NPAPER_TRADE_STARTz09:30)r9   r<   PAPER_TRADE_ENDz15:00)r;   r   r=   r>   r?   r   r   r   paper_trade_window8   rE   rH   now_utctz_namec                 C   s`   | d u rt  } zddlm} |d}||}| jd dj|d|W S  ty/   |  Y S w )Nr   )ZoneInfoUTC)tzinfo)r   utcnowzoneinforK   replace
astimezoner0   )rI   rJ   rK   utctzr   r   r   	_to_local>   s   rT   now_minuteswindowinclude_endc                C   sp   |  }| }||kr&|r||   ko|kS   S ||   ko#|k S   S |r0| |kp/| |kS | |kp7| |k S r   )r   r   )rU   rV   rW   startendr   r   r   _within_window_minutesN   s   rZ   c                 C   sf   t  }t| |}z| dkrW dS W n	 ty   Y nw t }t|jd t|j }t||ddS )N   Fr   TrW   )	r6   rT   weekdayr0   rD   r   hourminuterZ   rI   rS   locwminsr   r   r   is_backend_market_hours\   s   
rd   c                 C   s<   t  }t| |}t }t|jd t|j }t||ddS )Nr   Fr\   )r6   rT   rH   r   r^   r_   rZ   r`   r   r   r   is_paper_trade_creation_timel   s
   
re   c                 C   s:   t  }t| |}t }t|jd t|j }|| kS r   )r6   rT   rH   r   r^   r_   r   r`   r   r   r   is_paper_trade_end_reachedu   s
   
rf   c                 C   s*   | j dd| jdd| jdd| jdS )N02dr)   -r=   )rV   r   r   r   format_window}   s   *ri   c                 C   s8   t  }t| |}z|dW S  ty   t| Y S w )Nz%Y-%m-%d %H:%M %Z)r6   rT   strftimer0   r"   )rI   rS   ra   r   r   r   local_time_str   s   
rk   c                 C   s   t  }t| |}t }z|j|j|jddd}W n
 ty"   Y dS w ||kr.|tdd }z| dkrE|tdd }| dks5W |S W |S  tyQ   Y |S w )zBReturn next backend market open datetime in local market timezone.r   )r^   r_   secondmicrosecondNr+   )daysr[   )	r6   rT   rD   rP   r	   r
   r0   r   r]   )rI   rS   ra   rb   	candidater   r   r   next_backend_market_open_local   s*   
rp   c                 C   s   t  }t| |S )z1Return current datetime in market local timezone.)r6   rT   )rI   rS   r   r   r   	local_now   s   
rq      )min_seconds	now_localtarget_localrs   c                C   s:   z
t ||   }W n ty   d}Y nw tt ||S )Nr   )r   total_secondsr0   max)rt   ru   rs   secr   r   r   seconds_until   s   ry   r   )r    dataclassesr   r   r   typingr   r   r   r"   r&   r   r4   r6   rD   rH   rT   boolrZ   rd   re   rf   ri   rk   rp   rq   ry   r   r   r   r   <module>   s*    &		$