
    ghhC                     |   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
mZ d dlmZ d dlZd dlZ ej                   e      Zd dlmZ d dlmZ d dlmZ d d	lmZ  e       Zej9                  d
ej:                         ee      fdej<                  defd       ZejA                  dej:                         edd       ee      fde!de!defd       Z"ejA                  dejF                         edd       edd       ed d       ee      fde!de!de!de!def
d       Z$ejA                  d
ejJ                         edd       edd       edd       edd       edd        ed!d"       ed#d$       ee      fde!d%e
e!   d&e
e!   d'e
e&   d(e
e'   d)e!d*e!defd+       Z(ejS                  dej:                         edd      d ee      fde!de!d,ejT                  defd-       Z+ejY                  d       edd       ee      fde!de!defd.       Z-ej9                  d/       edd       ee      fde!de!defd0       Z.ej9                  d1       edd       ee      fde!de!defd2       Z/ej9                  d3ej`                         ee      fd4ejb                  defd5       Z2ejA                  d6ej`                         edd       ee      fd7e!de!defd8       Z3ejA                  deej`                            edd       edd       ed d       edd9       edd:       ee      fde!de!de!de!d;e
e!   d<e
e!   defd=       Z4ejS                  d6ej`                         edd      d ee      fd7e!de!d,ejj                  defd>       Z6ejY                  d6       edd       ee      fd7e!de!defd?       Z7ejA                  d@eej`                            eddA       edd       eddB       edd       eddC       eddD       ee      fdEe&de!de
e!   d%e
e!   dFe
e&   de!defdG       Z8ejA                  dHeej`                            edd       eddI       eddJ       edKd       ee      fde!de!dLedMede!defdN       Z9ejA                  dO       edd       edd       ee      fde!d%e
e!   defdP       Z:ejA                  dQ       edd       eddB       edd       edRdS       ee      fde!de
e!   d%e
e!   dTe!def
dU       Z;ejy                  dV      dWefdX       Z=ejA                  dY      dZ        Z>ej9                  d[       edd\       edd]       ed^d_       ee      fd%e!d&e
e!   d`e&defda       Z?y)b    )	APIRouterDependsHTTPExceptionQuery	WebSocketWebSocketDisconnect)Session)OptionalList)dateN)get_db)ThreadService)ThreadHistoryService)schemaz/threads)response_modelthread_datadbc                     	 t        |      }|j                  |       S # t        $ r}t        dt	        |            d}~ww xY w)zCreate a new chat thread.  status_codedetailN)r   create_thread	Exceptionr   str)r   r   thread_servicees       >/var/www/html/hubwallet-dev/src/marketing/apps/hwGpt/router.pyr   r      sC    <&r*++K88 <CF;;<    	A=Az/threads/{thread_id}.zUser ID)description	thread_iduser_idc                 ^    t        |      }|j                  | |      }|st        dd      |S )zGet a specific thread by ID.  Thread not foundr   )r   
get_threadr   )r!   r"   r   r   threads        r   r&   r&   $   s6     #2&N&&y':F4FGGM    z/threads/{thread_id}/messages2   z$Maximum number of messages to returnzNumber of messages to skiplimitoffsetc                 b    t        |      }|j                  | |||      }|st        dd      |S )zGet thread with its messages.r$   r%   r   )r   get_thread_with_messagesr   )r!   r"   r*   r+   r   r   thread_with_messagess          r   r-   r-   4   sA     #2&N)BB7E6  4FGGr(   zFilter by store IDzFilter by branch IDzFilter by thread typezFilter by archive status   zPage number   zNumber of threads per pagestore_id	branch_idthread_typeis_archivedpage	page_sizec           	      F    t        |      }|j                  | ||||||      S )z4List threads for a user with pagination and filters.)r   list_user_threads)	r"   r1   r2   r3   r4   r5   r6   r   r   s	            r   r8   r8   H   s0     #2&N++9k;i r(   update_datac                     |st        j                         }t        |      }|j                  | ||      }|st	        dd      |S )zUpdate a thread.r$   r%   r   )r   ThreadUpdateRequestr   update_threadr   )r!   r"   r9   r   r   updated_threads         r   r<   r<   Z   sJ     002"2&N#11)WkRN4FGGr(   c                 d    t        |      }|j                  | |      }|st        dd      dddS )zDelete a thread (soft delete).r$   r%   r   TzThread deleted successfullysuccessmessage)r   delete_threadr   r!   r"   r   r   r@   s        r   rB   rB   n   s=     #2&N**9g>G4FGG(EFFr(   z/threads/{thread_id}/archivec                 d    t        |      }|j                  | |      }|st        dd      dddS )zArchive a thread.r$   r%   r   TzThread archived successfullyr?   )r   archive_threadr   rC   s        r   rE   rE   ~   s=     #2&N++Iw?G4FGG(FGGr(   z/threads/{thread_id}/unarchivec                 d    t        |      }|j                  | |      }|st        dd      dddS )zUnarchive a thread.r$   r%   r   TzThread unarchived successfullyr?   )r   unarchive_threadr   rC   s        r   rG   rG      s=     #2&N--iAG4FGG(HIIr(   z	/messagesmessage_datac                     	 t        |      }|j                  |       S # t        $ r}t        dt	        |            d}~ww xY w)zAdd a new message to a thread.r   r   N)r   add_messager   r   r   )rH   r   history_servicer   s       r   rJ   rJ      sC    <.r2**<88 <CF;;<r   z/messages/{message_id}
message_idc                 ^    t        |      }|j                  | |      }|st        dd      |S )zGet a specific message by ID.r$   Message not foundr   )r   get_messager   )rL   r"   r   rK   rA   s        r   rO   rO      s6     +2.O))*g>G4GHHNr(   zGet messages before this IDzGet messages after this IDbefore_message_idafter_message_idc                 D    t        |      }|j                  | |||||      S )z3Get messages from a thread with pagination options.)r   get_thread_messages)r!   r"   r*   r+   rP   rQ   r   rK   s           r   rS   rS      s0     +2.O..7E6+<>N r(   c                     |st        j                         }t        |      }|j                  | ||      }|st	        dd      |S )zUpdate a message.r$   rN   r   )r   MessageUpdateRequestr   update_messager   )rL   r"   r9   r   rK   updated_messages         r   rV   rV      sJ     113*2.O%44Z+VO4GHHr(   c                 d    t        |      }|j                  | |      }|st        dd      dddS )zDelete a message (soft delete).r$   rN   r   TzMessage deleted successfullyr?   )r   delete_messager   )rL   r"   r   rK   r@   s        r   rY   rY      s=     +2.O,,ZAG4GHH(FGGr(   z/messages/searchzSearch queryzFilter by thread IDzFilter by message rolezMaximum number of resultsqueryrolec                 D    t        |      }|j                  || ||||      S )zSearch messages across threads.)r   search_messages)rZ   r"   r!   r1   r[   r*   r   rK   s           r   r]   r]      s.     +2.O**	8T5 r(   z(/threads/{thread_id}/messages/date-rangez
Start datezEnd dated   
start_dateend_datec                 B    t        |      }|j                  | ||||      S )z/Get messages from a thread within a date range.)r   !get_thread_messages_by_date_range)r!   r"   r_   r`   r*   r   rK   s          r   rb   rb     s,     +2.O<<7J% r(   z/threads/statsc                 <    t        |      }|j                  | |      S )z!Get thread statistics for a user.)r   get_thread_stats)r"   r1   r   r   s       r   rd   rd     s!     #2&N**7H==r(   z/messages/stats   zNumber of days to analyzedaysc                 @    t        |      }|j                  | |||      S )z"Get message statistics for a user.)r   get_message_stats)r"   r!   r1   rf   r   rK   s         r   rh   rh     s%     +2.O,,Wi4PPr(   z/chat/marketing	websocketc           
        K   | j                          d{    	 dddd}| j                  t        j                  |             d{    	 	 | j	                          d{   }t        j
                  |      }|j                  d      }|j                  d      }|j                  d      }|j                  d	      }|j                  d
      }|j                  dd      }	|j                  dd| d|       }
t        j                  d|        |r|r|s0| j                  t        j                  ddd             d{    	 ddl	m
} ddlm}  |       } |       }|	dk(  rV|j                  |t        |      |t        |      |rt        |      nd|rt        |      nd|
       d{   }d|||||dd}nT|j                  |t        |      |t        |      |rt        |      nd|rt        |      nd       d{   }d|||||dd}|j!                          | j                  t        j                  |             d{    7 <7 7 7 7 7 Z# t"        $ rB}t        j%                  dt'        |              dd| d||||t'        |      d}Y d}~d}~ww xY w7 d# t        j(                  $ r3 | j                  t        j                  dd d             d{  7   Y w xY w# t*        $ r t        j                  d!       Y yt"        $ rD}t        j%                  d"t'        |              | j!                          d{  7   Y d}~yd}~ww xY ww)#zGWebSocket endpoint for marketing-focused chat with persona integration.Nconnection_establishedz!Connected to hwGpt marketing chatready)typerA   statusr1   r2   r"   r!   rA   rm   text
session_iduser__store_zReceived message: errorz6Missing required fields: store_id, user_id, or message)rm   rA   r   ChatbotLLMService)get_db_sessionimageimage_generation_response)rm   rA   r"   r1   r2   r!   message_typellm_responsezLLM error: responsez
Received: z (LLM temporarily unavailable))rm   rA   r"   r1   r2   r!   rs   zInvalid JSON formatzWebSocket disconnectedzWebSocket error: )accept	send_textjsondumpsreceive_textloadsgetloggerinfo$src.marketing.apps.hwGpt.llm_serviceru   src.utils.dbrv    process_image_generation_requestintprocess_chat_messagecloser   rs   r   JSONDecodeErrorr   )ri   welcome_messagedatarA   r1   r2   r"   r!   user_messagery   rp   ru   rv   r   llm_servicerz   r{   r   s                     r   websocket_marketing_chatr   -  sh     


w  -:

 !!$**_"=>>> f&3355**T* #;;z2#KK4	!++i0#KK4	&{{95&{{66:$[[wiwxj7YZ
0	:;  wl#--djj '#[: /    DV; ()B #4"5K $w.-8-Y-YL(M.7C	NT.7C	NT&. ( %@'3'.(0)2)2,3$ .9-M-ML(M.7C	NT.7C	NT. ( %3'3'.(0)2)2,2$ HHJ   ))$**X*>???C   	? 6 ((,(, ! LL;s1vh!78 !+%/~=[#\#*$,%.%.!$Q H @'' ))$**#46 +     .,-  (Q12oo s  M*IM*-K; 	I
K; J2 #I$C J2 IJ2 	K; A%I" 0I1AI" I I" $'J2 J0J2 K; M*K; J2 J2 I"  I" "	J-+8J(#J2 (J--J2 2=K8/K20K85K; 7K88K; ;M'M*M'#4M"MM"M*"M''M*z/chat/connections/statsc                      dddS )z$Get WebSocket connection statistics.disabledz(Connection stats temporarily unavailable)rn   rA    r   r(   r   get_chat_connection_statsr     s     !-WXXr(   z/chat/suggestionszStore IDz	Branch IDgeneralzContext for suggestionscontextc                     	 ddl m}  |       }|j                  || |      }|j                  ||      }d|| ||dS # t        $ r}t        dt        |            d}~ww xY w)z,Get chat suggestions based on store persona.r   rt   T)r@   suggestionsr1   r2   r   i  r   N)r   ru   get_store_persona_contextget_chat_suggestionsr   r   r   )	r1   r2   r   r   ru   r   store_personar   r   s	            r   r   r     sv    <J')#==b(IV!66}gN & "
 	
  <CF;;<s   9< 	A AA )@fastapir   r   r   r   r   r   sqlalchemy.ormr	   typingr
   r   datetimer   r~   logging	getLogger__name__r   r   r   'src.marketing.apps.hwGpt.thread_servicer   /src.marketing.apps.hwGpt.thread_history_servicer   src.marketing.apps.hwGptr   routerpostThreadResponseThreadCreateRequestr   r   r   r&   ThreadWithMessagesResponser-   ThreadListResponser   boolr8   putr;   r<   deleterB   rE   rG   MessageResponseMessageCreateRequestrJ   rO   rS   rU   rV   rY   r]   rb   rd   rh   ri   r   r   r   r   r(   r   <module>r      s   \ \ " !   			8	$  A P ,	 Z(=(=> &/	<++	<	< ?	< "63H3HI )4&/ 	 J +F<]<]^ )4r'MN'CD&/      	 
 	  _ & Jv'@'@A)4#D6JK$T7LM!&t9P!Q"':T"Ua]32+GH&/sm } #	
 $   	 B" "63H3HI )4.2&/	 ++ 		 J& %& )4&/GGG 	G 'G +, )4&/HHH 	H -H -. )4&/JJJ 	J /J  [)?)?@ &/	<--	<	< A	< $V5K5KL )4&/ 	 M +DAWAW<XY )4r'MN'CD',T?\']&+D>Z&[&/  	
  } sm 	 Z  $V5K5KL )4/3&/	 ,, 		 M& '( )4&/HHH 	H )H  tF4J4J/KLs7)4$T7LM#D6JK2JKr'BC&/ } sm	
 3-  	 M  6tFLbLbGcd )4Sl;3J7s(NO&/  	
  	 e  )4#D6JK&/>>sm> 	> > )4$T7LM#D6JKb&AB&/	Q	Q}	Q sm	Q 		Q
 		Q 	Q #${ i {  %{ z %&Y 'Y  !#:6$T{C0IJ&/	<<}< < 		< "<r(   