o
    ̿SiE                     @   s   d dl Z d dlZd dlZd dl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mZmZ eeZedZe  Zedd	pLd	  d
vZdddZddeddfddZdS )    N)datetime)ZoneInfo)get_mongo_db)refresh_movers_service&refresh_live_movers_from_latest_movers)backend_market_windowformat_windowis_backend_market_hourslocal_time_str	local_nownext_backend_market_open_localseconds_untilzAsia/Kolkata#MOVERS_REFRESH_ENFORCE_MARKET_HOURS1)0falsenooffreturnc                  C   s   t  } t| }z[z2t|}t|dg }t|dg }t|}td|d|| td|d|d W n tyH   t	d Y nw W z| 
  W dS  tyb   tjd	d
d Y dS w z| 
  W w  tyy   tjd	d
d Y w w )zRun a single ET movers refresh cycle (synchronous).

    This is run in a worker thread so the FastAPI event loop stays responsive.
    gainerslosersz;[MoversRefresh] Refreshed movers: %s | gainers=%d losers=%d
fetched_atzE[MoversRefresh] Rebuilt live_movers from movers | built=%s skipped=%sbuiltskippedz*[MoversRefresh] Error refreshing ET moversz*[MoversRefresh] Error closing DB generatorT)exc_infoN)r   nextr   lengetr   loggerinfo	Exception	exceptionclosedebug)db_gendbrecordr   r   lm r(   >/var/www/html/Trade-python/app/v1/background/movers_refresh.py_refresh_movers_once_sync   s@   r*     interval_secondsc              	      s   t dI dH  td|  	 tr=t s=t }tdt tt	  |dur4t t
t |I dH  qt | I dH  qt rOtd t | I dH  qt4 I dH  t tI dH  W d  I dH  n1 I dH snw   Y  t | I dH  q)a-  Background loop to refresh ET movers periodically.

    Intended to be started from FastAPI's startup event via
    `asyncio.create_task(movers_refresh_loop(...))`.

    Parameters
    ----------
    interval_seconds: int
        Sleep interval between refresh cycles. Default: 900s (15 minutes).
       Nz@[MoversRefresh] Background ET movers loop started (interval=%ss)TzJ[MoversRefresh] Skipped: outside backend market hours | now=%s | window=%szB[MoversRefresh] Previous refresh still running; skipping this tick)asynciosleepr   r   r   r	   r   r
   r   r   r   r   _MOVERS_REFRESH_LOCKlocked	to_threadr*   )r,   nxtr(   r(   r)   movers_refresh_loop:   s8   

(r4   )r   N)r+   ) r.   loggingosr   zoneinfor   app.db.databaser   app.v1.services.moversr   r   app.v1.utils.market_timer   r   r	   r
   r   r   r   	getLogger__name__r   ISTLockr0   getenvstriplowerr   r*   intr4   r(   r(   r(   r)   <module>   s"    $

#