
    h,<                         d dl Z d dlZd dlmZmZmZmZ d dlmZm	Z	 d dl
mZ d dlmZ d dlmZ d dlmZ d dlmZ  ej(                  e      Z G d	 d
      Z G d d      Zy)    N)DictSetOptionalAny)	WebSocketWebSocketDisconnect)Session)ChatbotLLMService)ThreadService)ThreadHistoryService)get_db_sessionc            
       ~    e Zd ZdZd Zddedededee   fdZddededee   fd	Z	dd
edededee   fdZ
d
efdZy)ConnectionManagerz.Manages WebSocket connections for the chatbot.c                 >    i | _         i | _        t               | _        y N)active_connectionsuser_threadsr
   llm_serviceselfs    I/var/www/html/hubwallet-dev/src/marketing/apps/hwGpt/websocket_manager.py__init__zConnectionManager.__init__   s    8:,.,.    N	websocketuser_idstore_id	branch_idc                 4  K   |j                          d{    | d| d|xs d }|| j                  |<   d| j                  |<   t        j	                  d|        dd|||d}|j                  t        j                  |             d{    y7 }7 w)zConnect a new WebSocket client.N_mainzWebSocket connected: connection_establishedzConnected to hwGpt chatbot)typemessager   r   r   )acceptr   r   loggerinfo	send_textjsondumps)r   r   r   r   r   connection_keywelcome_messages          r   connectzConnectionManager.connect   s        #9AhZq1Df0EF2;/,0.)+N+;<= -3 "
 !!$**_"=>>># 	!" 	?s"   BBA7BBBBc                     | d| d|xs d }|| j                   v r| j                   |= || j                  v r| j                  |= t        j                  d|        y)zDisconnect a WebSocket client.r   r    WebSocket disconnected: N)r   r   r%   r&   )r   r   r   r   r*   s        r   
disconnectzConnectionManager.disconnect,   sk    #9AhZq1Df0EFT444''7T...!!.1.~.>?@r   r#   c           	      2  K   | d| d|xs d }|| j                   v r(	 | j                   |   j                  |       d{    yy7 # t        $ rA}t        j	                  d| dt        |              | j                  |||       Y d}~yd}~ww xY ww)z"Send a message to a specific user.r   r    NzError sending message to : )r   r'   	Exceptionr%   errorstrr/   )r   r#   r   r   r   r*   es          r   send_personal_messagez'ConnectionManager.send_personal_message8   s     #9AhZq1Df0EFT444>--n=GGPPP 5P >88H3q6(ST9==>s@   B!A
 AA
 BA
 
	B7B
BBBc           
        K   g }| j                   j                         D ]  \  }}	 |j                  |       d{    ! |D ]2  }|j                  dd      \  }}}	| j                  |||	dk7  r|	nd       4 y7 ># t        $ r?}t        j                  d| dt        |              |j                  |       Y d}~d}~ww xY ww)z-Broadcast a message to all connected clients.NzError broadcasting to r1   r      r    )
r   itemsr'   r2   r%   r3   r4   appendsplitr/   )
r   r#   disconnected_keysr*   
connectionr5   keyr   r   r   s
             r   	broadcastzConnectionManager.broadcastD   s     *.*A*A*G*G*I 	9&NJ9 **7333	9 % 	[C+.99S!+<(GXyOOGXI<OyUYZ	[ 4 95n5ERAxPQ!((889s=   #CA;A9A;:C9A;;	C5B>9C>CCr   )__name__
__module____qualname____doc__r   r   r4   r   r,   r/   r6   r?    r   r   r   r      s    8/
?y ?3 ?# ?ZbcfZg ?*
A# 
A 
A# 
A
>3 
> 
>PS 
>`hil`m 
>[s [r   r   c                       e Zd ZdZd Z	 	 ddedededee   deee	f   f
d	Z
dededed
edeee	f   f
dZddedededee   fdZdeee	f   fdZy)ChatbotWebSocketManagerz.Manages chatbot-specific WebSocket operations.c                 @    t               | _        t               | _        y r   )r   connection_managerr
   r   r   s    r   r   z ChatbotWebSocketManager.__init__X   s    "3"5,.r   Nr   r   r   r   message_datac                   K   	 t               }	 |j                  dd      }|j                  d      }|j                         sA|j                  t	        j
                  ddd             d{    	 |j                          y|st        |      }	t        |      |rt        |      ndt        |      d|dd	  d
ddd}
ddl	m
}  |j                  d(i |
}|	j                  |      }|j                  }|j                  t	        j
                  d||j                  d             d{    | j                  j!                  ||t        |      |t        |      |rt        |      nd      }|d   r|j                  t	        j
                  d|d   d   |d   d   |d   d   d             d{    |j                  t	        j
                  d|d   d   |d   d   |d   d   |d   d   |d   d   |d             d{    | d| d|xs d }|| j"                  j$                  |<   t&        j)                  d | d!|        nP|j                  t	        j
                  d|j                  d"d#      |j                  dd$      d%             d{    |j                          y7 @7 7 7 7  # |j                          w xY w# t*        $ re}t&        j-                  d&t/        |              |j                  t	        j
                  dd't/        |      d%             d{  7   Y d}~yd}~ww xY ww))z5Handle incoming chat messages and generate responses.r#    	thread_idr3   zMessage cannot be emptyr"   r#   NzMarketing Strategy -    z...zMarketing-focused chat thread	marketingr   r   r   titledescriptionthread_typer   schemathread_created)r"   rL   rQ   )dbrL   r   user_messager   r   successuser_message_receivedrX   idcontent
created_at)r"   
message_idr\   	timestampai_responsetokens_used
model_used)r"   r^   r\   r_   ra   rb   rL   r   r    z,Chat message processed successfully: Thread z, User responsezFailed to process messagezUnknown errorr"   r#   detailszError handling chat message: zInternal server errorrD   )r   getstripr'   r(   r)   closer   intsrc.marketing.apps.hwGptrU   ThreadCreateRequestcreate_threadr[   rQ   r   process_chat_messagerH   r   r%   r&   r2   r3   r4   )r   r   r   r   r   rI   rW   rX   rL   thread_servicethread_datarU   thread_requestthreadresultr*   r5   s                    r   handle_chat_messagez+ChatbotWebSocketManager.handle_chat_message\   st    ^	!BR+//	2>(,,[9	#))+#--djj '#<: /    P 
K !%22%6N$'M7@S^d#&w<#8cr9J8K3!O'F'2#K @%?V%?%?%N+%NN+99.IF &		I $--djj 0%.!': /    ))>>'L!- ]09c)nt ?  )$#--djj 7&,^&<T&B#).#9)#D%+N%;L%I	: /    $--djj -&,]&;D&A#)-#8#C%+M%:<%H'-m'<]'K&,]&;L&I%.: /    )0y(1Y=P&<Q%RNKTD++88HKK"NykY`ah`i jk $--djj '#)::j:U#V#)::g#G: /    
Y2$$ 
 	LL8QAB%%djj2q62 '   	s   L?
K AJ9 ,J,-J9 2K L?B&J9 )J/*BJ9 1J22AJ9 J5BJ9 J7J9 K +L?,J9 /J9 2J9 5J9 7J9 9KK 	L<AL7,L/-L72L?7L<<L?	operationdatac                 F  K   	 t               }	 |dk(  rt        |      }t        |      |j                  d      rt        |j                  d            ndt        |      |j                  dd      |j                  dd      |j                  dd	      d
}ddlm}	  |	j                  d*i |}
|j                  |
      }|j                  t        j                  d|j                  |j                  |j                  |j                  dd             d{    nS|dk(  rt        |      }|j                  t        |      t        |      |j                  dd      |j                  dd            }|j                  t        j                  d|j                   D cg c]  }|j#                          c}|j$                  |j&                  |j(                  d             d{    n|dk(  r|j                  d      }|rkt+        |      }|j-                  t        |      t        |      d      }| d| d|j                  dd       }t        |      | j.                  j0                  |<   |j                  t        j                  d||D cg c]  }|j#                          c}d             d{    n|d k(  r| j2                  j5                  |t        |      |j                  d      rt        |j                  d            nd      }| j2                  j7                  ||j                  d!d"            }|j                  t        j                  d#|d$             d{    |j9                          y7 kc c}w 7 c c}w 7 7 '# |j9                          w xY w# t:        $ rk}t<        j?                  d%| d&tA        |              |j                  t        j                  d'd(| tA        |      d)             d{  7   Y d}~yd}~ww xY ww)+z>Handle thread-related operations (create, list, switch, etc.).rl   r   NrQ   zNew Chat ThreadrR   rK   rS   chatrP   r   rT   rV   )r[   rQ   rR   rS   )r"   rq   list_threadspage   	page_size   )r   r   ry   r{   threads_listed)r"   threadstotalry   r{   switch_threadrL   2   )rL   r   limitr   r    thread_switched)r"   rL   messagesget_suggestionscontextgeneralsuggestions)r"   r   z Error handling thread operation r1   r3   z
Failed to rd   rD   )!r   r   ri   rf   rj   rU   rk   rl   r'   r(   r)   r[   rQ   rR   rS   list_user_threadsr~   dicttotal_threadsry   r{   r   get_thread_messagesrH   r   r   get_store_persona_contextget_chat_suggestionsrh   r2   r%   r3   r4   )r   r   r   r   rt   ru   rW   rn   rp   rU   ro   rq   r~   rL   history_servicer   r*   msgstore_personar   r5   s                        r   handle_thread_operationsz0ChatbotWebSocketManager.handle_thread_operations   s    ^	!BS/%22%6N$'MCG88KCXS+)>%?^b#&w<!%'3D!E'+xxr'B'+xxv'F&N @"<&"<"<"N~"NK+99+FF#--djj 0"())%+\\+1+=+=+1+=+=	#: /    .0%22%6N,>> #G!$X!XXfa0"&((;";	 ? G $--djj 0@G#PfFKKM#P!(!6!6 '%,%6%6: /    /1 $ 5I *>r*B#2#F#F&))n$'L"$ $G $ -49AhZq+W]A^@_)`ORS\~//<<^L'11$**$5)2?G(H(H> 3    "33$($4$4$N$NCMR]I^3txx/D+Edh%M #'"2"2"G"G%txx	9'E#K $--djj -'2: /    
E, $Q6 )I  
 	LL;I;bQQR%%djj'	{3q62 '   	s   P!
N* DN NBN N41N %N	&B,N N)N 9N:B1N +N,N 0N*  P!N N N N N''N* *	P3APPPP!PP!c           
        K   | j                   j                  ||||       d{    	 	 |j                          d{   }t        j                  |      }|j                  dd      }|dk(  r| j                  |||||       d{    n|dk(  rA|j                  d      }|j                  di       }	| j                  |||||	       d{    nf|dk(  r/|j                  t        j                  ddi             d{    n2|j                  t        j                  d	d
| d             d{    7 7 7 7 t7 B7 # t        $ r% t        j                  d| d| d|xs d        Y n6t        $ r+}
t        j                  dt        |
              Y d}
~
nd}
~
ww xY w| j                   j!                  |||       y# | j                   j!                  |||       w xY ww)z/Handle the main WebSocket connection lifecycle.Nr"   rw   thread_operationrt   ru   pingpongr3   zUnknown message type: rM   r.   r   r    zWebSocket error: )rH   r,   receive_textr(   loadsrf   rs   r   r'   r)   r   r%   r&   r2   r3   r4   r/   )r   r   r   r   r   ru   rI   message_typert   operation_datar5   s              r   handle_websocket_connectionz3ChatbotWebSocketManager.handle_websocket_connection.  s    %%--i(IVVV&	M&3355#zz$/+//?6)22!7Hi   "%77 , 0 0 =I%1%5%5fb%AN77!7Hi   "V+#--djj&&9I.JKKK $--djj '%;L>#J: /   7  	W
 6 L
 # 	_KK27)1XJa	H[U[G\]^ 	7LL,SVH566	7 ##..w)LD##..w)Ls   "G+D;G+E D>AE E AE E3E E2E 4E5E ;G+>E  E E E E +F(3G	 5F(=!F#G	 #F((G	 +G+	G((G+returnc                     t        | j                  j                        t        | j                  j                        t	        | j                  j                  j                               dS )zGet connection statistics.)r   r   connection_keys)lenrH   r   r   listkeysr   s    r   get_connection_statsz,ChatbotWebSocketManager.get_connection_statsZ  sS     #&d&=&=&P&P"Q 7 7 D DE#D$;$;$N$N$S$S$UV
 	
r   )NNr   )r@   rA   rB   rC   r   r   r4   r   r   r   rs   r   r   r   rD   r   r   rF   rF   U   s    8/ $('+gg g 	g
 C=g 38ngRgg g 	g
 g 38ngR*M9 *Ms *M^a *Mnvwzn{ *MX
d38n 
r   rF   )r(   loggingtypingr   r   r   r   fastapir   r   sqlalchemy.ormr	   $src.marketing.apps.hwGpt.llm_servicer
   'src.marketing.apps.hwGpt.thread_servicer   /src.marketing.apps.hwGpt.thread_history_servicer   src.utils.dbr   	getLoggerr@   r%   r   rF   rD   r   r   <module>r      sP      + + 2 " B A P '			8	$C[ C[LK
 K
r   