
    7uh                     Z   % S SK r S SKrS SKrS SKJr  S SKJrJr  S SKJ	r	  S SK
J
r
Jr  S SKJr  S SKJr  S SKJrJr  S S	KJr  S S
KJrJr  \" 5         \R2                  " SS5      R5                  5       S:H  rSq\	\S'   0 rS rS r S\4S jr!S\4S jr"S\4S jr#S\4S jr$S\4S jr%S r&g)    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                  Z   #    [        SS9q[        R                  5       I S h  vN   g  N7f)Nzlocalhost:9092)bootstrap_servers)r   r   start     JC:\Suresh\moveshuttle\MDcreated\moveengine\app\v1\sockets\tracking_data.pystart_kafka_producerr      s      2BCH
..
s   !+)+c                  `   #    [         (       a  [         R                  5       I S h  vN   g g  N7f)N)r   stopr   r   r   stop_kafka_producerr      s!     xmmo s   #.,.	websocketc           	      2
  #    U R                  5       I S h  vN   [        R                  " 5       n[        U5      nUS   nUS   nUS   nUS   nUS   nUS   nUS   n	[	        S5          U R                  5       I S h  vN n
[        R                  " U
5      n[        R                  " 5       US
'   [	        SU5        UR                  S5      n [        U5      nUR                  SU05      nU(       d  U R                  S5      I S h  vN   M  0 UEUS   SS.En[        R                   " U["        S9R%                  5       n['        UR)                  0 SSS.5      5      nS nU H  nUS   R%                  5       U;   d  M  Un  O   [	        S5        [	        SU5        [	        SU5        [	        S5        U(       a  UR                  SUS   05      nUR+                  US   US   SUS    3S	S.5        UUS   US   US   SUS    3UUS
   SS .n[,        (       aP  [.        (       aE  [.        R1                  S![        R                   " U["        S9R3                  S"5      5      I S h  vN   OUR5                  U5        [,        (       aP  [.        (       aE  [.        R1                  S#[        R                   " U["        S9R3                  S"5      5      I S h  vN   OUR5                  U5         UR                  S$5      nU(       Ga4  UUR                  S%5      UR                  S&5      UR                  S'5      UR                  S(5      S).[        R                  " 5       S*.nUR                  S+5      nUR                  S,5      nUR7                  S[        U5      0S-U05        US.:X  a'  U(       a   UR7                  S[        U5      0S-U05        OYUS:X  a'  U(       a   U	R7                  S[        U5      0S-U05        O,UR9                  S/U0S-U05        U	R9                  S/U0S-U05        [;        U5      I S h  vN   UR                  S25      (       a!  U R                  S3US    S435      I S h  vN   OU R                  S55      I S h  vN   GM   GNs GN! [        R                   a    U R                  S5      I S h  vN     GMW  f = f GN GNc GN N! [<         a  n[	        S0U S1U 35         S nANS nAff = f N Nx! [>         a    [	        S65         g f = f7f)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 ===r0   category_namezAlert detected: )r0   r1   messager+   unread)r(   r*   r0   r1   r2   raw_payloadr'   statusalertszutf-8vehicle_trackinglocationspeedheadingfuel	timestamp)coordinatesr9   r:   r;   r<   )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!   rC   
categorieskeywordsr%   r&   r2   datar(   device_obj_iddevicetracking_entrypayload_textall_keywordsmatched_keywordkwcategory	alert_docr=   last_location_updateassociated_typeassociated_ides                              r   websocket_tracking_datarq     sE    



%%'IOE/*M|$JM"G'(J%&H8_Fk"I	
+,K%2244G::g&D"*//"3D,d3 -I ( 3
 %%um&<=F))*:;;;$\2!N  ::dC8>>@L  baPQ2R STL"O"i=&&(L8&(O #
 -./<0$o6+,%..}7U/VW%%#+E?%-o%>!1/)2L1MN $	'  "+"("6#+E?%-o%>!1/)2L1MN#'#'#6&		 9"-- 

9c:AA'J  
 )))4 yXXmm&JJ~s;BB7K  
 ((8/U"hhz2 ,7%)XXg%6'+xx	':$(HHV$4)-+)>* )1(9	,( '-jj1I&JO$*JJ/E$FM && 34!56 ')3))"H]$;<#%9: )K7M!,,"H]$;<#%9:
 **&	2#%9: "--&	2#%9:
 4I>>> !!*--))@P_A`@aabc    ))*GHHHM   5 (( ))*HIII <\h ? UB9+RPQsSTTU
 I -.s  TR	AT*S< >R?AS< R .S< S	A3S<  C%S< %S&A+S< SS< )ES 1S2S 61S< 'S8(S< S:S< 	TS< (S7R:8S=S< SS< S< S< S 
S5S0+S< 0S55S< :S< <TTTTc                 b  #    U R                  5       I S h  vN   [        R                  " U 5        [        S[	        [        5      5          [
        R                  " S5      I S h  vN   M    NU N! [         a2    [        R                  " U 5        [        S[	        [        5      5         g f = f7f)Nu   ✅ Client connected. Total:r.   u#   ❌ Client disconnected. Remaining:)	rE   r	   addrH   lenasynciosleepr   remove)r   s    r   websocket_realtime_updatesrx   4  s     



)$	
(#.?*@AM--"""   # M  +3S9J5KLMsE   B/A,3B/A0 %A.&A0 ,B/.A0 09B,)B/+B,,B/c                   #    U R                  5       I S h  vN    U R                  5       I S h  vN n[        R                  " U5      nUR	                  S5      nUR	                  S5      nU(       a  U(       d2  U R                  S5      I S h  vN   U R                  5       I S h  vN   g  [        R                  " US5      n[        R                  " 5       n[        R                  " 5       n[        U5      nUS   n	U	R                  UUUS.S.S	S	S	S	S	S	S	S	S	S	S	S	S	S
.5      R                  SS	5      n
[!        S5        [!        U
5        [!        S5        U
 GHU  n[#        US   5      UR	                  S5      UR	                  S5      UR	                  S5      UR	                  S5      UR	                  S5      UR	                  S5      UR	                  S5      UR	                  S5      UR	                  S5      UR	                  S5      UR	                  SS5      UR	                  S5      (       a  UR	                  S5      R%                  5       OS S.n[!        SU5        U R                  [        R&                  " U["        S95      I S h  vN   [(        R*                  " S5      I S h  vN   GMX     U R                  S5      I S h  vN   U R                  5       I S h  vN    [        U5        g  GN GN GNg GNR! [         a6    U R                  S5      I S h  vN    U R                  5       I S h  vN     g f = f N N N| Nf! [,         a     g f = f! [.         a    [!        S5         g [0         a`  n[!        S [#        U5       35        U R                  S![#        U5       35      I S h  vN    U R                  5       I S h  vN     S nAg S nAff = f7f)"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(   r8   r9   r:   r;   r'   r*   r+   r0   r1   r2   UUIDr'   cursorcursorcursorcursorz************************r)   r8   r9   r:   r;   r{   r*   r0   r1   r2   r+   F)idr(   r8   r9   r:   r;   r{   r*   r0   r1   r2   r+   r'   z$Historical record is alert checking:r,   g?doneu   ⚠️ Client disconnected.u   ❌ Error: zError: )rE   rI   rJ   rK   rM   rP   closer   strptimerL   
ValueErrorr
   rF   rG   rV   sortrH   rS   	isoformatrR   ru   rv   StopIterationr   r^   )r   query
query_datar(   datetime_str
start_dateend_dater_   r`   
collectioncursordocresponserp   s                 r   websocket_historical_router   F  sS    



\ ,,..ZZ&
 NN;/	!~~f-%%&BCCC//###	!**<9LMJ(H ))+	Y?+
 &&#    !"
. $}a
 / 	0 	()f()C#e*o WW[1GGJ/)779-!ggl3"ww}5!$!9779-GGJ6EHWW]E[E[sww}5??AaeH  8(C%%djj3&GHHH--$$$' * !!&)))oo	Oi . D#  	%%&TUUU//###	r I$)
  		  -+,  CF8$%!!GCF8"4555oo s@  OK/OM K2AM K5M &K8'M +O-,K; F0M 	L>
M 'M (M MM MM #M .O2M 5M 8M ;L;LL;2L53L;8M 9O:L;;M  M M M 
MM OMM O+O-	O67O-N0.OO	OOOOc           	      R  #    U R                  5       I S h  vN    U R                  5       I S h  vN n[        R                  " U5      nUR	                  S5      nU(       d2  U R                  S5      I S h  vN   U R                  5       I S h  vN   g U [        U'   [        SU S[        [        5       35         [        R                  " S5      I S h  vN   M    N N Ni NS N! [         a4    W[        ;   a'  [        U	 [        SU S[        [        5       35         g  g f = f7f)Nworkforce_idzMissing workforce_id.u   ✅ Workforce z connected. Total clients: r.   u   ❌ Workforce z disconnected. Remaining: )rE   rI   rJ   rK   rM   rP   r   r	   rH   rt   ru   rv   r   )r   msgrc   r   s       r   websocket_workforce_schedulesr     s    



e**,,zz#xx/%%&=>>>//###*3,'|n,GL]H^G_`a--"""   -
 ?# # e,,!,/N<.0J3O`KaJbcd -es   D'CD'C& CAC& 6C 7C& C"C& D'AC& C$C& D'C&  C& "C& $C& &9D$D'#D$$D'c                   #    U R                  5       I S h  vN   [        R                  " 5       n[        U5      n U R	                  5       I S h  vN n[
        R                  " U5      n[        S0 UD6nUR                  UR                  UR                  US.[        U '   [        UR                  UR                  UR                  U5      n[        S0 UD6nU R                  [
        R                  " UR!                  5       ["        S95      I S h  vN    U R	                  5       I S h  vN   M   GN N N$ N! [$         a!    ['        S5        U [        ;   a	  [        U 	  g  g f = f7f)N)latitude	longitude	radius_kmdbr,   u"   ❌ Nearby devices WS disconnectedr   )rE   r
   rF   rG   rI   rJ   rK   r   r   r   r   active_nearby_subscribersr   r   rP   rR   dictrS   r   rH   )r   r_   r   init_messagerc   payloadresultr   s           r   websocket_nearby_devicesr     sE    



%%'I	iB5&3355zz,'&..  (( ** **	0
!), 4g//1B1BB
 ,5f5!!$**X]]_c"JKKK ((*** 5  6" 	L + 52311))4 25si   E(D1$E(D: D4CD: D6D: *D8+D: 1E(4D: 6D: 8D: :&E% E($E%%E(c                 p  #    [        [        R                  5       5       Hi  u  p [        US   US   US   US   5      n[	        S0 UD6nUR                  [        R                  " UR                  5       [        S95      I S h  vN   Mk     g  N	! [         a  n[        SU 35         S nAM  S nAff = f7f)Nr   r   r   r   r,   u,   ⚠️ Failed sending update to subscriber: r   )rU   r   itemsr   r   rP   rJ   rR   r   rS   r^   rH   )updated_devicewssubr   r   rp   s         r   r]   r]     s     1779:	F7J[!13{3CSYF 09&9H,,tzz(--/3GHHH ; I 	F@DEE	FsA   #B6ABBB	B6B
B3B.(B6.B33B6)'ru   rJ   osdotenvr   fastapir   r   aiokafkar   r   r   app.utils.connectionsr	   app.dbr
   bsonr   r   rN   #app.v1.services.platform.iotdevicesr   !app.v1.models.platform.iotdevicesr   r   getenvrT   r   r   __annotations__r   r   r   rq   rx   r   r   r   r]   r   r   r   <module>r      s      	  2 % ' 3  0 R \ IIk7+113v=	 "
 !  
vXY Xt
M	 
Md^ 	 ^ @e9 e0!5i !5J	Fr   