o
    7uh                     @   s"  U d dl Z d dlZd dlZd dlmZ d dlmZmZ d dlm	Z	 d dl
m
Z
mZ d dlmZ d dlmZ d dlmZmZ d d	lmZ d d
lmZmZ e  edd dkZdae	ed< i Zdd Zdd Z defddZ!defddZ"defddZ#defddZ$defddZ%dd Z&dS )     N)load_dotenv)	WebSocketWebSocketDisconnect)AIOKafkaProducer)datetime	timedelta)connected_clients)database)ObjectIderrors)"list_nearby_devices_service_socket)NearbyDevicesRequestIotDeviceWithMappingList	USE_KAFKAfalsetrueproducerc                      s   t ddat I d H  d S )Nzlocalhost:9092)bootstrap_servers)r   r   start r   r   8/var/www/html/moveengine/app/v1/sockets/tracking_data.pystart_kafka_producer   s   
r   c                      s   t rt  I d H  d S d S )N)r   stopr   r   r   r   stop_kafka_producer   s   r   	websocketc              
      s  |   I d H  t }t|}|d }|d }|d }|d }|d }|d }|d }	td z	 |  I d H }
t|
}t	 |d
< td| |
d}zt|}W n tjyg   | dI d H  Y q2w |d|i}|sz| dI d H  q2i ||d dd}tj|td }t|i ddd}d }|D ]}|d  |v r|} nqtd td| td| td |r|d|d i}||d |d d|d  d	d ||d |d |d d|d  ||d
 dd }trtrtd!tj|tdd"I d H  n|| tr*tr*td#tj|tdd"I d H  n|| z~|
d$}|r||
d%|
d&|
d'|
d(d)t	 d*}|
d+}|
d,}|dt|id-|i |d.kr||r||dt|id-|i n)|dkr|r|	dt|id-|i n|d/|id-|i |	d/|id-|i t|I d H  W n ty } ztd0| d1|  W Y d }~nd }~ww |
d2r| d3|d  d4I d H  n| d5I d H  q3 ty   td6 Y d S w )7Ntracking_logs
alert_logsiot_devicesalert_categoryalert_keywordsfleets	workforcezwebsocket_tracking_data STARTEDTreceived_atzIncoming WebSocket Data:	device_idu   ❌ Invalid device_id format_idzUnknown device
account_idF)r%   is_alertdefault   )keywordcategory_idr*   z=== ALERT DEBUG START ===zPayload text:zMatched keyword:z=== ALERT DEBUG END ===r+   category_namezAlert detected: )r+   r,   messager&   unread)r#   r%   r+   r,   r-   raw_payloadr"   statusalertszutf-8vehicle_trackinglocationspeedheadingfuel	timestamp)coordinatesr4   r5   r6   r7   )last_locationlast_updatedassociated_entity_typeassociated_entity_idz$setvehicledevicesu*   ⚠️ Failed to update last location for z: r&   u*   ✅ Stored in tracking_logs + alert_logs ()u   ✅ Stored in tracking_logsu   ⚠️ WebSocket disconnected) acceptr	   get_mongo_dbnextprintreceive_textjsonloadsr   utcnowgetr
   bson_errors	InvalidId	send_textfind_onedumpsstrlowerlistfindupdater   r   sendencode
insert_one
update_oneupdate_manynotify_nearby_subscribers	Exceptionr   )r   	mongo_genmongor   r   r>   
categorieskeywordsr    r!   r-   datar#   device_obj_iddevicetracking_entrypayload_textall_keywordsmatched_keywordkwcategory	alert_docr8   last_location_updateassociated_typeassociated_ider   r   r   websocket_tracking_data  s  













   	rl   c                    sj   |   I d H  t|  tdtt z
	 tdI d H  q ty4   t|  tdtt Y d S w )Nu   ✅ Client connected. Total:Tr)   u#   ❌ Client disconnected. Remaining:)	r@   r   addrC   lenasynciosleepr   remove)r   r   r   r   websocket_realtime_updates4  s   

rr   c                    s  |   I d H  z|  I d H }t|}|d}|d}|r$|s6| dI d H  |  I d H  W d S zt|d}t	 }W n t
y\   | dI d H  |  I d H  Y W d S w t }t|}|d }	|	|||ddd	d	d	d	d	d	d	d	d	d	d	d	d	d
dd	}
td t|
 td |
D ]^}t|d |d|d|d|d|d|d|d|d|d|d|dd|dr|d nd d}td| | tj|tdI d H  tdI d H  q| dI d H  |  I d H  zt| W W d S  ty   Y W d S w  ty&   td Y d S  tyV } z$td t|  | d!t| I d H  |  I d H  W Y d }~d S d }~ww )"Nr#   datezMissing device_id or date.z%Y-%m-%d %H:%M:%Sz,Invalid date format. Use YYYY-MM-DD HH:MM:SSr   )z$gtez$lt)r#   r"   r)   )r$   r#   r3   r4   r5   r6   r"   r%   r&   r+   r,   r-   UUIDr"   cursorcursorcursorcursorz************************r$   r3   r4   r5   r6   rt   r%   r+   r,   r-   r&   F)idr#   r3   r4   r5   r6   rt   r%   r+   r,   r-   r&   r"   z$Historical record is alert checking:r'   g?doneu   ⚠️ Client disconnected.u   ❌ Error: zError: )r@   rD   rE   rF   rH   rK   closer   strptimerG   
ValueErrorr	   rA   rB   rQ   sortrC   rN   	isoformatrM   ro   rp   StopIterationr   rY   )r   query
query_datar#   datetime_str
start_dateend_daterZ   r[   
collectioncursordocresponserk   r   r   r   websocket_historical_routeF  s   





r   c              	      s   |   I d H  z?|  I d H }t|}|d}|s.| dI d H  |  I d H  W d S | t|< td| dt	t  	 t
dI d H  q? tyg   |tv rdt|= td| dt	t  Y d S Y d S w )	Nworkforce_idzMissing workforce_id.u   ✅ Workforce z connected. Total clients: Tr)   u   ❌ Workforce z disconnected. Remaining: )r@   rD   rE   rF   rH   rK   rx   r   rC   rn   ro   rp   r   )r   msgr^   r   r   r   r   websocket_workforce_schedules  s*   

r   c                    s   |   I d H  t }t|}zH|  I d H }t|}tdi |}|j|j	|j
|dt| < t|j|j	|j
|}tdi |}| tj| tdI d H  	 |  I d H  qQ typ   td | tv rmt| = Y d S Y d S w )N)latitude	longitude	radius_kmdbr'   Tu"   ❌ Nearby devices WS disconnectedr   )r@   r	   rA   rB   rD   rE   rF   r   r   r   r   active_nearby_subscribersr   r   rK   rM   dictrN   r   rC   )r   rZ   r   init_messager^   payloadresultr   r   r   r   websocket_nearby_devices  s6   

r   c                    s   t t D ]D\}}z't|d |d |d |d }tdi |}|tj| t	dI d H  W q t
yK } ztd|  W Y d }~qd }~ww d S )Nr   r   r   r   r'   u,   ⚠️ Failed sending update to subscriber: r   )rP   r   itemsr   r   rK   rE   rM   r   rN   rY   rC   )updated_devicewssubr   r   rk   r   r   r   rX     s   "rX   )'ro   rE   osdotenvr   fastapir   r   aiokafkar   r   r   app.utils.connectionsr   app.dbr	   bsonr
   r   rI   #app.v1.services.platform.iotdevicesr   !app.v1.models.platform.iotdevicesr   r   getenvrO   r   r   __annotations__r   r   r   rl   rr   r   r   r   rX   r   r   r   r   <module>   s:   
   }   `%