o
    ̿SiO                     @   s(  d dl Z d dlZd dlmZ d dlmZmZmZmZmZm	Z	 d dl
mZ d dlmZ e eZeddZedd	Zed
dZdedefddZdeeef defddZddddedeee  dedeeef fddZd dededeeeef  fddZd dededeeef fddZdS )!    N)datetime)AnyDictIterableListOptionalTuple)
Collection)ZerodhaClientSTOCKS_COLLECTIONstocksZERODHA_INSTRUMENTS_COLLECTIONzerodha_instrumentsSYSTEM_META_COLLECTIONsystem_metasymbolreturnc                 C   s   | pd   S )N )stripupper)r    r   ;/var/www/html/Trade-python/app/v1/services/stocks_master.py_norm_symbol   s   r   instc                 C   sh   t | dpd  }t | dpd  }|dv r dS |dv r&dS |ds0|d	r2dS dS )
zJBest-effort filter: allow equities + indices; exclude obvious derivatives.instrument_typer   segment>   CEPEFUTF>   EQINDEXTNSEBSE)strgetr   r   
startswith)r   itsegr   r   r   _instrument_is_stock_like   s   r(   T)	exchangesallow_cache_writezerodha_clientr)   r*   c                 C   s  |pdg}t  }| t }d}d}d}d}	|D ]}
|
pd  }||p(g }|	t|7 }	|rcz"| t jd|	  di|	  d|||dd|iddd	 W n t
yb   td
| Y nw |D ]}t|tsmqet|dpt|  |kr}qet|sqet|dp|d}|sqe|dp|d}|du rqe|||dp||d||d|d|d|d|d|dd}dd | D |ddd}|j||d|dd	}t|ddr|d7 }z|d|jid d!t|jii W qe t
y   td"|| Y qew |jr|d7 }qe|d7 }qeqz| t jd#d$id d$||	d%idd	 W n
 t
y<   Y nw d||||	|d&d' |D d(S ))a  Refresh the `stocks` master list from Zerodha instruments.

    Non-negotiable contract:
    - Stocks are created only from Zerodha instruments.
    - One stock = one row.
    - No manual stock creation elsewhere.

    Notes:
    - This function UPSERTs into `stocks` by (symbol, exchange) and preserves existing `stock_id`.
    - If a row is newly inserted and stock_id is missing, it is set to str(_id) for backward compatibility.
    - Optionally writes a raw instruments cache into `zerodha_instruments` for legacy consumers.
    r!   r   type_master)r,   exchangeinstrumentslast_updated
created_at)$setz$setOnInsertT)upsertz'Failed writing instruments cache for %sr.   tradingsymbolr   instrument_tokentokenNnamer   seriesr   	tick_sizelot_sizeZERODHA_INSTRUMENTS)r   r.   r4   r7   r5   r   r8   r   r9   r:   last_refreshed_atsourcec                 S   s   i | ]\}}|d ur||qS )Nr   ).0kvr   r   r   
<dictcomp>   s    z)refresh_stocks_master.<locals>.<dictcomp>)r1   	is_activer   r.   upserted_id   _idr2   stock_idz!Failed setting stock_id for %s %skeystocks_master_last_refreshed)rH   valuer/   c                 S   s   g | ]
}t |  qS r   )r#   r   r   )r>   xr   r   r   
<listcomp>   s    z)refresh_stocks_master.<locals>.<listcomp>)okinsertedupdatedkeptr/   	timestampr)   )r   utcnowr   r   r   get_instrumentslenINSTRUMENTS_CACHE_COLLECTION
update_onelower	Exceptionlogger	exception
isinstancedictr#   r$   r(   r   itemsgetattrrD   modified_countr   )dbr+   r)   r*   nowstocks_collrN   rO   rP   total_instrumentsexexur/   r   symr5   patch
update_docresr   r   r   refresh_stocks_master+   s   

	



:
rj   r!   r.   c                 C   s4   t |}|sd S |pd  }| t ||dS )Nr!   rC   )r   r   r   r   find_one)r`   r   r.   rf   rd   r   r   r   get_stock_by_symbol   s
   rl   c                 C   s.   t | ||d}|std| dt| |S )N)r.   z Stock not found in master list: :)rl   KeyErrorr   )r`   r   r.   stockr   r   r   require_stock_by_symbol   s   rp   )r!   )loggingosr   typingr   r   r   r   r   r   pymongo.collectionr	   app.v1.services.zerodha.clientr
   	getLogger__name__rY   getenvr   rU   r   r#   r   boolr(   rj   rl   rp   r   r   r   r   <module>   s4     



 $$