
    źh8                         d dl Z d dlmZmZmZmZ d dlmZ d dlm	Z	m
Z
mZmZ d dlmZmZmZ d dlmZmZ d dlmZ  e j*                  e      Z G d d	      Zy)
    N)ListOptionalDictAny)Session)funcand_descasc)datetimetimezone	timedelta)ChatMessage
ChatThread)schemac                   8   e Zd ZdZdefdZdej                  dej                  fdZ	de
de
deej                     fd	Z	 	 	 	 d de
de
de
de
dee
   dee
   deej                     fdZ	 d!de
de
dedede
deej                     fdZ	 	 	 	 d"de
dedee
   dee
   dee   de
deej                     fdZde
de
dej&                  deej                     fdZde
de
defdZ	 	 	 d#de
dee
   dee
   de
deeef   f
dZd$de
de
fdZdedej                  fdZy
)%ThreadHistoryServicez6Service for managing chat thread history and messages.dbc                     || _         y )N)r   )selfr   s     N/var/www/html/hubwallet-dev/src/marketing/apps/hwGpt/thread_history_service.py__init__zThreadHistoryService.__init__   s	        message_datareturnc           	         	 | j                   j                  t              j                  t        j                  |j
                  k(  t        j                  |j                  k(  t        j                  dk(        j                         }|st        d      t        |j
                  |j                  |j                  |j                  |j                  |j                  |j                        }| j                   j!                  |       | j                   j#                          | j                   j%                  |       t'        j(                  t*        j,                        |_        | j                   j#                          t0        j3                  d|j                   d|j
                          | j5                  |      S # t6        $ rA}t0        j9                  dt;        |              | j                   j=                           d}~ww xY w)zAdd a new message to a thread.Tz!Thread not found or access denied)	thread_iduser_idrolecontentmessage_type	image_url
model_usedzAdded message z to thread zError adding message: N)r   queryr   filteridr   r   	is_activefirst
ValueErrorr   r   r    r!   r"   r#   addcommitrefreshr   nowr   utc
updated_atloggerinfo_build_message_response	Exceptionerrorstrrollback)r   r   threadmessagees        r   add_messagez ThreadHistoryService.add_message   s   %	WW]]:.55!7!77""l&:&::$$, eg	   !DEE "&00$,,!&&$,,)66&00'22G GGKK GGNNGGOOG$ !)X\\ :FGGNNKK.K@V@V?WXY//88 	LL1#a&:;GG	s   F;F> >	H<HH
message_idr   c           	         	 | j                   j                  t              j                  t              j                  t        j                  |k(  t        j                  |k(  t        j                  dk(        j                         }|sy| j                  |      S # t        $ r.}t        j                  d| dt        |              Y d}~yd}~ww xY w)zGet a specific message by ID.FNzError getting message : )r   r$   r   joinr   r%   r&   r   
is_deletedr(   r2   r3   r0   r4   r5   r   r;   r   r8   r9   s        r   get_messagez ThreadHistoryService.get_message<   s    	ggmmK055jAHH*,""g-&&%/ eg	  //88 	LL1*RAxHI	s   BB 	B 	C#$CCNr   limitoffsetbefore_message_idafter_message_idc           	         	 | j                   j                  t              j                  t        j                  |k(  t        j
                  |k(  t        j                  dk(        j                         }|sg S | j                   j                  t              j                  t        j                  |k(  t        j                  dk(        }|r"|j                  t        j                  |k        }|r"|j                  t        j                  |kD        }|j                  t        t        j                              j                  |      j                  |      j!                         }	|	D 
cg c]  }
| j#                  |
       c}
S c c}
w # t$        $ r0}t&        j)                  d| dt+        |              g cY d}~S d}~ww xY w)z;Get messages from a thread with various pagination options.TFzError getting thread messages r=   N)r   r$   r   r%   r&   r   r'   r(   r   r   r?   order_byr   
created_atrC   rB   allr2   r3   r0   r4   r5   )r   r   r   rB   rC   rD   rE   r7   r$   messagesmsgr9   s               r   get_thread_messagesz(ThreadHistoryService.get_thread_messagesN   sb   	WW]]:.55*""g-$$, eg	  	 GGMM+.55%%2&&%/E ![^^6G%GH[^^6F%FG ~~c+*@*@&ABII&QWWX]^bbdHAIJ#D005JJJ 	LL9)Bs1vhOPI	s7   A4F 7C1F (F F F 	G%F<6G<G
start_dateend_datec           	         	 | j                   j                  t              j                  t        j                  |k(  t        j
                  |k(  t        j                  dk(        j                         }|sg S | j                   j                  t              j                  t        j                  |k(  t        j                  dk(  t        j                  |k\  t        j                  |k        j                  t        t        j                              j                  |      j                         }|D cg c]  }| j!                  |       c}S c c}w # t"        $ r0}	t$        j'                  d| dt)        |	              g cY d}	~	S d}	~	ww xY w)z/Get messages from a thread within a date range.TFz,Error getting thread messages by date range r=   N)r   r$   r   r%   r&   r   r'   r(   r   r   r?   rH   rG   r   rB   rI   r2   r3   r0   r4   r5   )
r   r   r   rM   rN   rB   r7   rJ   rK   r9   s
             r   !get_thread_messages_by_date_rangez6ThreadHistoryService.get_thread_messages_by_date_rangey   s<   	WW]]:.55*""g-$$, eg	  	 ww}}[188%%2&&%/&&*4&&(2	
 hs;1123EE%L  BJJ#D005JJJ 	LLG	{RTUXYZU[T\]^I	s7   A4E 7B<E 3EE E 	F%FFFr$   store_idr   c           
      P   	 | j                   j                  t              j                  t              j                  t        j                  |k(  t        j                  dk(  t        j                  dk(  t        j                  j                  d| d            }|r"|j                  t        j                  |k(        }|r"|j                  t        j                  |k(        }|r"|j                  t        j                  |k(        }|j                  t        t        j                               j#                  |      j%                         }|D 	cg c]  }	| j'                  |	       c}	S c c}	w # t(        $ r-}
t*        j-                  dt/        |
              g cY d}
~
S d}
~
ww xY w)zSearch messages across threads.TF%zError searching messages: N)r   r$   r   r>   r   r%   r   r'   r?   r    iliker   rQ   r   rG   r
   rH   rB   rI   r2   r3   r0   r4   r5   )r   r   r$   r   rQ   r   rB   
base_queryrJ   rK   r9   s              r   search_messagesz$ThreadHistoryService.search_messages   sN   	{388DKK""g-$$,&&%/##))AeWA,7	J '..{/D/D	/QR
'..z/B/Bh/NO
'..{/?/?4/GH
 "**40F0F+GHNNuUYY[HAIJ#D005JJJ 	LL5c!fX>?I	s0   EE/ E*'E/ *E/ /	F%8"F F% F%update_datac           	         	 | j                   j                  t              j                  t              j                  t        j                  |k(  t        j                  |k(  t        j                  dk(        j                         }|sy|j                  |j                  |_
        |j                  |j                  |_        |j                  |j                  |_        |j                  |j                  |_        t        j                  t        j                         |_        | j                   j%                          | j                   j'                  |       t(        j+                  d|        | j-                  |      S # t.        $ rH}t(        j1                  d| dt3        |              | j                   j5                          Y d}~yd}~ww xY w)zUpdate a message.FNzUpdated message zError updating message r=   )r   r$   r   r>   r   r%   r&   r   r?   r(   r    r!   r"   r   r-   r   r.   r/   r+   r,   r0   r1   r2   r3   r4   r5   r6   )r   r;   r   rW   r8   r9   s         r   update_messagez#ThreadHistoryService.update_message   sm    	ggmmK055jAHH*,""g-&&%/ eg	   ""."-"5"5''3'2'?'?$$$0$/$9$9!%%1%0%;%;"!)hll!;GGGNNGGOOG$KK*:,78//88 	LL2:,bQIJGG	s   BF 	C9F 	G>GGc           	      ~   	 | j                   j                  t              j                  t              j                  t        j                  |k(  t        j                  |k(  t        j                  dk(        j                         }|syd|_        t        j                  t        j                        |_        | j                   j                          t         j#                  d|        y# t$        $ rH}t         j'                  d| dt)        |              | j                   j+                          Y d}~yd}~ww xY w)zSoft delete a message.FTzDeleted message zError deleting message r=   N)r   r$   r   r>   r   r%   r&   r   r?   r(   r   r-   r   r.   r/   r+   r0   r1   r3   r4   r5   r6   r@   s        r   delete_messagez#ThreadHistoryService.delete_message   s    	ggmmK055jAHH*,""g-&&%/ eg	   "&G!)hll!;GGGNNKK*:,78 	LL2:,bQIJGG	s   BC+ 	A!C+ +	D<4>D77D<daysc                    	 t        j                  t        j                        }|t	        |      z
  }| j
                  j                  t              j                  t              j                  t        j                  |k(  t        j                  dk(  t        j                  dk(  t        j                  |k\  t        j                  |k        }|r"|j                  t        j                  |k(        }|r"|j                  t        j                   |k(        }|j#                         }|j                  t        j$                  dk(        j#                         }	|j                  t        j$                  dk(        j#                         }
|j                  t        j$                  dk(        j#                         }|j                  t        j&                  dk(        j#                         }|j                  t        j&                  dk(        j#                         }|j                  t        j&                  d	k(        j#                         }g }t)        d
      D ]  }|t	        |      z
  }|j+                  dddd      }|j+                  dddd      }|j                  t        j                  |k\  t        j                  |k        j#                         }|j-                  |j/                         j1                         |d        ||	|
||||t3        t5        |            |d	S # t6        $ r:}t8        j;                  d| dt=        |              dddddddg |d	cY d}~S d}~ww xY w)z"Get message statistics for a user.r\   TFuser	assistantsystemtextimagefile   r   )hourminutesecondmicrosecond   ;   i?B )datecount)	total_messagesuser_messagesassistant_messagessystem_messagestext_messagesimage_messagesfile_messagesdaily_countsperiod_daysz%Error getting message stats for user r=   N)r   r-   r   r.   r   r   r$   r   r>   r   r%   r   r'   r?   rH   r   rQ   rm   r   r!   rangereplaceappendrl   	isoformatlistreversedr3   r0   r4   r5   )r   r   r   rQ   r\   rN   rM   rU   rn   ro   rp   rq   rr   rs   rt   ru   irl   	day_startday_enddaily_countr9   s                         r   get_message_statsz&ThreadHistoryService.get_message_stats  s   K	||HLL1H!I4$88J {388DKK""g-$$,&&%/&&*4&&(2J '..{/D/D	/QR
'..z/B/Bh/NO
 (--/N '--k.>.>&.HIOOQM!+!2!2;3C3C{3R!S!Y!Y![(//0@0@H0LMSSUO '--k.F.F&.PQWWYM'..{/G/G7/RSYY[N&--k.F.F&.PQWWYM L1X )"33 LLa!QRLS	,,Br"RX,Y(//**i7**g5 %' 
 ##%NN,668(%   #1!.&8#2!."0!. $Xl%; <#
 
  	LL@	CPQF8TU"#!"&'#$!""#!" "#
 
	s   LL! !	M$*/MM$M$c                    	 t        j                  t        j                        t	        |      z
  }| j
                  j                  t              j                  t        j                  dk(  t        j                  |k        j                         }| j
                  j                  t              j                  t        j                  dk(  t        j                  |k        j                          | j
                  j                          t        j                  d| d       |S # t         $ rE}t        j#                  dt%        |              | j
                  j'                          Y d}~yd}~ww xY w)z/Clean up old deleted messages (admin function).r^   TzCleaned up z old deleted messagesz Error cleaning up old messages: Nr   )r   r-   r   r.   r   r   r$   r   r%   r?   r/   rm   deleter+   r0   r1   r3   r4   r5   r6   )r   r\   cutoff_dateold_messagesr9   s        r   cleanup_old_messagesz)ThreadHistoryService.cleanup_old_messagesZ  s   	",,x||4yd7KKK  77==5<<&&$.&&4 eg  GGMM+&--&&$.&&4 fhGGNNKK+l^3HIJ 	LL;CF8DEGG	s   D"D% %	E3.;E..E3r8   c                 4   t        j                  |j                  |j                  |j                  |j
                  |j                  |j                  |j                  |j                  |j                  |j                  |j                  |j                        S )zBuild message response.)r&   r   r   r   r    r!   r"   tokens_usedr#   rH   r/   r?   )r   MessageResponser&   r   r   r   r    r!   r"   r   r#   rH   r/   r?   )r   r8   s     r   r2   z,ThreadHistoryService._build_message_responsev  sy    %%zz''OOOO --''++))))))))
 	
r   )2   r   NN)d   )NNNr   )NN   )Z   )__name__
__module____qualname____doc__r   r   r   MessageCreateRequestr   r:   intr   rA   r   rL   r   rP   r5   rV   MessageUpdateRequestrY   boolr[   r   r   r   r   r   r2    r   r   r   r      sZ   @7 '(C(C 'H^H^ 'Rc C HVE[E[<\ , +/*.)) ) 	)
 ) $C=) #3-) 
f$$	%)b      	 
     
f$$	% L $("&"$$ $ C=	$
 3-$ sm$ $ 
f$$	%$L'' ' 00	'
 
&((	)'R s t < $("&SS C=S 3-	S
 S 
c3hSj c 8
{ 
v?U?U 
r   r   )loggingtypingr   r   r   r   sqlalchemy.ormr   
sqlalchemyr   r	   r
   r   r   r   r   src.marketing.apps.hwGpt.modelr   r   src.marketing.apps.hwGptr   	getLoggerr   r0   r   r   r   r   <module>r      sA     , , " , , 2 2 B +			8	$x
 x
r   