o
    m~2i´ ã                   @   sJ  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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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efd"d#„Z)defd$d%„Z*dS )&é    N)Úload_dotenv)Ú	WebSocketÚWebSocketDisconnect)ÚAIOKafkaProducer)ÚdatetimeÚ	timedelta)Úconnected_clientsÚdevice_subscriptions)Ú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   c                 Ã   s˜   |   d¡}ttƒD ]?}t  |¡}||krq
z| tj| td¡I d H  W q
 tyI } zt 	|¡ t 
|d ¡ td|› ƒ W Y d }~q
d }~ww d S )NÚ	device_id©Údefaultu   âŒ WebSocket broadcast error: )ÚgetÚlistr   r	   Ú	send_textÚjsonÚdumpsÚstrÚ	ExceptionÚdiscardÚpopÚprint)Útracking_entryr   ÚwsÚsubscribed_deviceÚer   r   r   Úbroadcast_tracking_update2  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q|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rg|rg| 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d,|› d-|› ƒ W Y d }~nd }~ww t|ƒI d H  | 
d.¡rÒ|  d/|d › d0¡I d H  n|  d1¡I d H  q3 t yé   td2ƒ Y d S w )3NÚtracking_logsÚ
alert_logsÚiot_devicesÚalert_categoryÚalert_keywordsÚfleetsÚ	workforcezwebsocket_tracking_data STARTEDTÚreceived_atzIncoming WebSocket Data:r   u   âŒ Invalid device_id formatÚ_idzUnknown deviceÚ
account_idF)r7   Úis_alertr   é   )ÚkeywordÚcategory_idr:   r;   Úcategory_namezAlert detected: )r;   r<   Úmessager8   Úunread)r   r7   r;   r<   r=   Úraw_payloadr5   ÚstatusÚalertszutf-8Úvehicle_trackingÚlocationÚspeedÚheadingÚfuelÚ	timestamp)ÚcoordinatesrD   rE   rF   rG   )Úlast_locationÚlast_updatedÚassociated_entity_typeÚassociated_entity_idz$setÚvehicleÚdevicesu*   âš ï¸ Failed to update last location for z: r8   u*   âœ… Stored in tracking_logs + alert_logs (ú)u   âœ… Stored in tracking_logsu   âš ï¸ WebSocket disconnected)!Úacceptr
   Úget_mongo_dbÚnextr'   Úreceive_textr!   Úloadsr   Úutcnowr   r   Úbson_errorsÚ	InvalidIdr    Úfind_oner"   r#   Úlowerr   ÚfindÚupdater   r   ÚsendÚencodeÚ
insert_oneÚ
update_oneÚupdate_manyÚnotify_nearby_subscribersr$   r,   r   )r-   Ú	mongo_genÚmongor.   r/   rN   Ú
categoriesÚkeywordsr3   r4   r=   Údatar   Údevice_obj_idÚdevicer(   Úpayload_textÚall_keywordsÚmatched_keywordÚkwÚcategoryÚ	alert_docrH   Úlast_location_updateÚ
assoc_typeÚassoc_idr+   r   r   r   Úwebsocket_tracking_data?  s¾   €


þþüø
$
$

ûø


€ €ÿ¢`ÿrr   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:Tr9   u#   âŒ Client disconnected. Remaining:)	rP   r   Úaddr'   ÚlenÚasyncioÚsleepr   Úremove)r-   r   r   r   Úwebsocket_realtime_updates°  s   €
ÿ
þrx   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.ú%Y-%m-%d %H:%M:%Sz,Invalid date format. Use YYYY-MM-DD HH:MM:SSr.   ©ú$gtez$lt)r   r5   r9   )r6   r   rC   rD   rE   rF   r5   r7   r8   r;   r<   r=   ÚUUIDr5   Úcursorcursorcursorcursorz************************r6   rC   rD   rE   rF   r}   r7   r;   r<   r=   r8   F©Úidr   rC   rD   rE   rF   r}   r7   r;   r<   r=   r8   r5   z$Historical record is alert checking:r   gš™™™™™É?Údoneu   âš ï¸ Client disconnected.õ   âŒ Error: úError: )rP   rS   r!   rT   r   r    Úcloser   ÚstrptimerU   Ú
ValueErrorr
   rQ   rR   rZ   Úsortr'   r#   Ú	isoformatr"   ru   rv   ÚStopIterationr   r$   )r-   ÚqueryÚ
query_datar   Údatetime_strÚ
start_dateÚend_daterb   rc   Ú
collectionÚcursorÚdocÚresponser+   r   r   r   Úwebsocket_historical_routeÂ  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: Tr9   u   âŒ Workforce z disconnected. Remaining: )rP   rS   r!   rT   r   r    r„   r   r'   rt   ru   rv   r   )r-   Úmsgrf   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   )rP   r
   rQ   rR   rS   r!   rT   r   r—   r˜   r™   Úactive_nearby_subscribersr   r   r    r"   Údictr#   r   r'   )r-   rb   rš   Úinit_messagerf   Ú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   )r   r›   Úitemsr   r   r    r!   r"   rœ   r#   r$   r'   )Úupdated_devicer)   ÚsubrŸ   r’   r+   r   r   r   ra   _  s   €ÿ"€ÿùra   c                 Ã   s.  |   ¡ I d H  d }z=|  ¡ I d H }t |¡}| d¡}| d¡}| d¡}| d¡}|s@|  d¡I d H  |  ¡ I d H  W d S dd„ }||ƒ}||ƒ}	||ƒ}
|rf|sf|  d¡I d H  |  ¡ I d H  W d S |r||	s||  d	¡I d H  |  ¡ I d H  W d S |r’|
s’|  d
¡I d H  |  ¡ I d H  W d S i }|	rž|
rž|	|
dœ}n|	r¨|	t ¡ dœ}n	|r±|t ¡ dœ}t	 
¡ }t|ƒ}|d }d|i}|rÇ||d< | |¡ dd¡}|D ]Z}t|d ƒ| d¡| d¡| d¡| d¡| d¡| d¡| d¡| d¡| d¡| d¡| dd¡| d¡r| d¡ ¡ nd dœ}|  tj|td¡I d H  t d¡I d H  qÒ|  d¡I d H  t | ¡ |t| < 	 t d!¡I d H  q? tyf   | tv rct | ¡ t | d ¡ Y d S Y d S  ty– } z$td"t|ƒ› ƒ |  d#t|ƒ› ¡I d H  |  ¡ I d H  W Y d }~d S d }~ww )$Nr   ry   Ú	from_dateÚto_dateúMissing device_id.c                 S   ó,   | rzt  | d¡W S  ty   Y d S w d S ©Nrz   )r   r…   r†   ©Úvaluer   r   r   Ú
parse_dateV  ó   ÿz1websocket_historical_and_live.<locals>.parse_datez7Invalid date format for 'date'. Use YYYY-MM-DD HH:MM:SSz<Invalid date format for 'from_date'. Use YYYY-MM-DD HH:MM:SSz:Invalid date format for 'to_date'. Use YYYY-MM-DD HH:MM:SS©r|   z$lter{   r.   r5   r9   r6   rC   rD   rE   rF   r}   r7   r;   r<   r=   r8   Fr   r   gš™™™™™©?Úhistory_doneTé
   r‚   rƒ   )rP   rS   r!   rT   r   r    r„   r   rU   r
   rQ   rR   rZ   r‡   r#   rˆ   r"   ru   rv   r   rs   r	   r   r%   r&   r$   r'   )r-   r   rŠ   r‹   Údate_strÚfrom_date_strÚto_date_strr«   Údate_valr¤   r¥   Údate_filterrb   rc   r   Úquery_objectr   r‘   r’   r+   r   r   r   Úwebsocket_historical_and_liveB  sœ   €






ó
ÿ

þ€ýr¶   c                 Ã   sL  |   ¡ I d H  d }zE|  ¡ I d H }t |¡}| d¡}| d¡}| d¡}| d¡}|s@|  d¡I d H  |  ¡ I d H  W d S dd„ }||ƒ}||ƒ}	||ƒ}
|rf|sf|  d¡I d H  |  ¡ I d H  W d S |r||	s||  d	¡I d H  |  ¡ I d H  W d S |r’|
s’|  d
¡I d H  |  ¡ I d H  W d S i }|	rž|
rž|	|
dœ}n|	r¨|	t ¡ dœ}n	|r±|t ¡ dœ}t	 
¡ }t|ƒ}|d }d|i}|rÇ||d< | |¡ dd¡}g }|D ]H}| t|d ƒ| d¡| d¡| d¡| d¡| d¡| d¡| d¡| d¡| d¡| d¡| dd¡| d¡r| d¡ ¡ nd dœ¡ qÔ|  tjd||dœtd¡I d H  |  d ¡I d H  t | ¡ |t| < td!|› ƒ 	 t d#¡I d H  qG tyu   | tv rrt | ¡ t | d ¡ td$|› ƒ Y d S Y d S  ty¥ } z$td%t|ƒ› ƒ |  d&t|ƒ› ¡I d H  |  ¡ I d H  W Y d }~d S d }~ww )'Nr   ry   r¤   r¥   r¦   c                 S   r§   r¨   )r   r…   r$   r©   r   r   r   r«     r¬   z5websocket_historical_and_live_all.<locals>.parse_datez2Invalid format for 'date'. Use YYYY-MM-DD HH:MM:SSz7Invalid format for 'from_date'. Use YYYY-MM-DD HH:MM:SSz5Invalid format for 'to_date'. Use YYYY-MM-DD HH:MM:SSr­   r{   r.   r5   r9   r6   rC   rD   rE   rF   r}   r7   r;   r<   r=   r8   Fr   Úhistory)Útyper   rf   r   r®   u(   âœ… Client subscribed for live updates: Tr¯   u   âŒ Disconnected: r‚   rƒ   )rP   rS   r!   rT   r   r    r„   r   rU   r
   rQ   rR   rZ   r‡   Úappendr#   rˆ   r"   r   rs   r	   r'   ru   rv   r   r%   r&   r$   )r-   r   rŠ   r‹   r°   r±   r²   r«   r³   r¤   r¥   r´   rb   rc   r   rµ   r   Úhistory_datar‘   r+   r   r   r   Ú!websocket_historical_and_live_all  s®   €




	


óýü
ÿ

ý€ýr»   )+ru   r!   ÚosÚdotenvr   Úfastapir   r   Úaiokafkar   r   r   Úapp.utils.connectionsr   r	   Úapp.dbr
   Úbsonr   r   rV   Ú#app.v1.services.platform.iotdevicesr   Ú!app.v1.models.platform.iotdevicesr   r   ÚgetenvrY   r   r   Ú__annotations__r›   r   r   r,   rr   rx   r“   r–   r    ra   r¶   r»   r   r   r   r   Ú<module>   sF   
     q  `% d B