
    h83                         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 d dl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)datetimetimezone)
ChatThreadChatMessage)schemac                      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j                     f
dZ	 	 	 	 	 	 d de
dee
   dee
   dee   dee   de
de
d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e
de
defdZde
de
defdZd!de
dee
   deeef   fdZdedej                  fdZdedej<                  fdZy)"ThreadServicez"Service for managing chat threads.dbc                     || _         y N)r   )selfr   s     F/var/www/html/hubwallet-dev/src/marketing/apps/hwGpt/thread_service.py__init__zThreadService.__init__   s	        thread_datareturnc           	         	 t        |j                  |j                  |j                  |j                  xs& dt        j                         j                  d       |j                  |j                        }| j                  j                  |       | j                  j                          | j                  j                  |       t        j                  d|j                    d|j                          | j#                  |      S # t$        $ rA}t        j'                  dt)        |              | j                  j+                           d}~ww xY w)zCreate a new chat thread.zChat Thread z%Y-%m-%d %H:%M)store_id	branch_iduser_idtitledescriptionthread_typezCreated new thread z
 for user zError creating thread: N)r   r   r   r   r   r   nowstrftimer    r!   r   addcommitrefreshloggerinfoid_build_thread_response	Exceptionerrorstrrollback)r   r   threades       r   create_threadzThreadService.create_thread   s   	$--%//#++!''e\(,,.:Q:QRb:c9d+e'33'33F GGKKGGNNGGOOF#KK-fii[
;CVCVBWXY..v66 	LL23q6(;<GG	s   DD 	E<EE	thread_idr   c           	         	 | j                   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 thread by ID.TNzError getting thread : )r   queryr   filterr)   r   	is_activefirstr*   r+   r'   r,   r-   r   r2   r   r/   r0   s        r   
get_threadzThreadService.get_thread-   s    	WW]]:.55*""g-$$, eg	  ..v66 	LL02c!fXFG	s   A3B 6B 	B>$B99B>limitoffsetc           	      Z   	 | j                   j                  t              j                  t        j                  |k(  t        j
                  |k(  t        j                  dk(        j                         }|sy| j                   j                  t              j                  t        j                  |k(  t        j                  dk(        j                  t        j                  j                               j                  |      j                  |      j!                         }| j#                  |      }|D cg c]  }| j%                  |       }	}t'        j(                  ||	t+        |	            S c c}w # t,        $ r.}
t.        j1                  d| dt3        |
              Y d}
~
yd}
~
ww xY w)zGet thread with its messages.TNF)r/   messagestotal_messagesz#Error getting thread with messages r4   )r   r5   r   r6   r)   r   r7   r8   r   r2   
is_deletedorder_by
created_atascr<   r;   allr*   _build_message_responser   ThreadWithMessagesResponselenr+   r'   r,   r-   )r   r2   r   r;   r<   r/   r>   thread_responsemsgmessage_responsesr0   s              r   get_thread_with_messagesz&ThreadService.get_thread_with_messages?   s_   	WW]]:.55*""g-$$, eg	   ww}}[188%%2&&%/ h{--1134VVF^EE%LQTQTQV  #99&AONV Ws!=!=c!B W W44&*"#45  !X  	LL>ykCPQF8TU	s1   A3E3 6B=E3 3E."E3 .E3 3	F*<$F%%F*Nr   r   r!   is_archivedpage	page_sizec           	         	 | j                   j                  t              j                  t        j                  |k(  t        j
                  dk(        }|r"|j                  t        j                  |k(        }|r"|j                  t        j                  |k(        }|r"|j                  t        j                  |k(        }|"|j                  t        j                  |k(        }|j                         }	|j                  t        t        j                              j                  |dz
  |z        j                  |      j!                         }
|
D cg c]  }| j#                  |       }}t%        j&                  ||	||      S c c}w # t(        $ rG}t*        j-                  d| dt/        |              t%        j&                  g d||      cY d}~S d}~ww xY w)z4List threads for a user with pagination and filters.TN   )threadstotal_threadsrM   rN   zError listing threads for user r4   r   )r   r5   r   r6   r   r7   r   r   r!   rL   countrA   r
   
updated_atr<   r;   rD   r*   r   ThreadListResponser+   r'   r,   r-   )r   r   r   r   r!   rL   rM   rN   r5   rR   rQ   r/   thread_responsesr0   s                 r   list_user_threadszThreadService.list_user_threadsf   s   -	GGMM*-44""g-$$,E Z%8%8H%DEZ%9%9Y%FGZ%;%;{%JK&Z%;%;{%JK "KKMM nnT**?*?%@AHHY&eIssu 
 SZZ ; ;F CZZ,,(+#	   [  	LL:7)2c!fXNO,,#	 	s0   EF	 F)F	 F	 		G<GGGupdate_datac           	         	 | j                   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&        j/                  d| dt1        |              | j                   j3                          Y d}~yd}~ww xY w)zUpdate a thread.TNzUpdated thread zError updating thread r4   )r   r5   r   r6   r)   r   r7   r8   r   r    r!   rL   r   r"   r   utcrT   r%   r&   r'   r(   r*   r+   r,   r-   r.   )r   r2   r   rX   r/   r0   s         r   update_threadzThreadService.update_thread   sa   	WW]]:.55*""g-$$, eg	     ,*00&&2%0%<%<"&&2%0%<%<"&&2%0%<%<" (X\\ :FGGNNGGOOF#KK/)56..v66 	LL1)Bs1vhGHGG	s   A3E0 6C9E0 0	G9>F<<Gc           	      x   	 | j                   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                  t        j                  |k(        j                         }|D ]1  }d|_        t        j                  t        j                        |_        3 | j                   j#                          t$        j'                  d| dt)        |       d       y# t*        $ rH}t$        j-                  d| dt/        |              | j                   j1                          Y d}~yd}~ww xY w)	zSoft delete a thread.TFzDeleted thread z and z	 messageszError deleting thread r4   N)r   r5   r   r6   r)   r   r7   r8   r   r"   r   rZ   rT   r   r2   rD   r@   r%   r'   r(   rG   r+   r,   r-   r.   )r   r2   r   r/   r>   messager0   s          r   delete_threadzThreadService.delete_thread   sY    	WW]]:.55*""g-$$, eg	    %F (X\\ :F ww}}[188%%2ce  $ @%)"%-\\(,,%?"@ GGNNKK/)E#h-	RS 	LL1)Bs1vhGHGG	s   A3E( 6C1E( (	F91>F44F9c           	      X   	 | j                   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Archive a thread.TFzArchived thread zError archiving thread r4   Nr   r5   r   r6   r)   r   r7   r8   rL   r   r"   r   rZ   rT   r%   r'   r(   r+   r,   r-   r.   r9   s        r   archive_threadzThreadService.archive_thread   s    	WW]]:.55*""g-$$, eg	  !%F (X\\ :FGGNNKK*9+67 	LL29+RAxHIGG	   A3C 6A!C 	D)!>D$$D)c           	      X   	 | j                   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Unarchive a thread.TFzUnarchived thread zError unarchiving thread r4   Nr`   r9   s        r   unarchive_threadzThreadService.unarchive_thread  s    	WW]]:.55*""g-$$, eg	  !&F (X\\ :FGGNNKK,YK89 	LL4YKr#a&JKGG	rb   c           	         	 | j                   j                  t              j                  t        j                  |k(  t        j
                  dk(        }|r"|j                  t        j                  |k(        }|j                         }|j                  t        j                  dk(        j                         }|j                  t        j                  dk(        j                         }| j                   j                  t        j                  t        j                              j                  t              j                  t        j                  |k(  t        j
                  dk(  t        j                  dk(        }|r"|j                  t        j                  |k(        }|j                         xs d}||||dS # t        $ r5}	t         j#                  d| dt%        |	              dddddcY d}	~	S d}	~	ww xY w)z!Get thread statistics for a user.TFr   )rR   active_threadsarchived_threadsr?   z$Error getting thread stats for user r4   N)r   r5   r   r6   r   r7   r   rS   rL   r   r   r)   joinr@   scalarr+   r'   r,   r-   )
r   r   r   r5   rR   rf   rg   message_queryr?   r0   s
             r   get_thread_statszThreadService.get_thread_stats  s   '	GGMM*-44""g-$$,E
 Z%8%8H%DE!KKMM"\\**@*@E*IJPPRN$||J,B,Bd,JKQQS !GGMM$**[^^*DEJJ:V]]""g-$$,&&%/M  - 4 4Z5H5HH5T U*1138qN "/"0$4"0	   	LL?y3q6(ST!""#$%"#	 	s   F6F9 9	G7*G2,G72G7r/   c                    | j                   j                  t              j                  t        j                  |j
                  k(  t        j                  dk(        j                         }t        j                  |j
                  |j                  |j                  |j                  |j                  |j                  |j                  |j                   |j"                  |j$                  |j&                  |      S )z)Build thread response with message count.F)r)   r   r   r   r   r    r!   r7   rL   rB   rT   message_count)r   r5   r   r6   r2   r)   r@   rS   r   ThreadResponser   r   r   r   r    r!   r7   rL   rB   rT   )r   r/   rm   s      r   r*   z$ThreadService._build_thread_responseI  s     k299!!VYY.""e+
 %' 	
 $$yy__&&NN,,****&&**(((('
 	
r   r]   c                 4   t        j                  |j                  |j                  |j                  |j
                  |j                  |j                  |j                  |j                  |j                  |j                  |j                  |j                        S )zBuild message response.)r)   r2   r   rolecontent	image_urlmessage_typetokens_used
model_usedrB   rT   r@   )r   MessageResponser)   r2   r   rp   rq   rr   rs   rt   ru   rB   rT   r@   )r   r]   s     r   rE   z%ThreadService._build_message_response`  sy    %%zz''OOOO'' --++))))))))
 	
r   )2   r   )NNNNrP      r   ) __name__
__module____qualname____doc__r   r   r   ThreadCreateRequestrn   r1   intr   r:   rF   rK   r-   boolrU   rW   ThreadUpdateRequestr[   r^   ra   rd   r   r   rk   r   r*   r   rv   rE    r   r   r   r      s   ,7 )C)C H]H] 4C # (6CXCX:Y , %% % 	%
 % 
&33	4%T #'#'%)&*88 3-8 C=	8
 c]8 d^8 8 8 
	"	"8t&& & //	&
 
&''	(&P"s "S "T "H c d 2#   2) )x} )PTUXZ]U]P^ )V
Z 
F<Q<Q 
.
{ 
v?U?U 
r   r   )loggingtypingr   r   r   r   sqlalchemy.ormr   
sqlalchemyr   r	   r
   r   r   src.marketing.apps.hwGpt.modelr   r   src.marketing.apps.hwGptr   	getLoggerry   r'   r   r   r   r   <module>r      s>     , , " ' ' ' B +			8	$b
 b
r   