
    )$/i:                     p    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JrJr   " S S5      rg	)
    )db)casefunc)current_user)
joinedload)datetime	timedelta)ChatMessageAgentec                       \ rS rSr\SS j5       r\S 5       r\SS j5       r\S 5       r\S 5       r	\S 5       r
SS	\4S
 jjrSrg)ChatService   Nc           	          [        [        S5      (       a  [        R                  R                  5       O[        R                  R                  5       n[
        R                  R                  [        5      R                  [        R                  [        R                  :H  5      nU b"  UR                  [        R                  U :H  5      nUR                  [        [        R                  5      5      R!                  U5      R#                  5       n/ nU GH  n[%        UR                  S S9n['        S U 5       S5      n['        S U 5       S5      n/ n	U(       a/  UR(                  (       a  U	R+                  SUR(                   35        U(       a/  UR(                  (       a  U	R+                  SUR(                   35        U	(       d  U(       a  US	   R(                  OS
n
OSR-                  U	5      n
[/        U
5      S:  a  U
SS S-   OU
nU(       a  US	   R                  OSnU(       a  US   R                  OSn[/        U5      nSnU(       aZ  U(       aS  UnUnU(       aH  U(       aA  UU-
  R1                  5       nUS	:  a  S	nUS:  a  [3        U5       S3nO[3        US-  5       S3nSnUR                  (       ar  [
        R                  R5                  [6        UR                  5      nU(       a=  [        US5      (       a  UR8                  (       a  UR8                  OSUR                   3n[        [        S5      (       a  UR                  (       a  UR                  OUR                  n[;        UR                  5      UR<                  =(       d    SUR                   3UU(       a  UR?                  5       O"[@        RB                  " 5       R?                  5       UU=(       d    S	US.nUR+                  U5        GM     US4$ ! [D         a1  n[G        S[;        U5       35        / S[;        U5       34s SnA$ SnAff = f)uz   
Busca o histórico de conversas para o usuário logado e agente específico (se fornecido),
estruturado para o frontend.

updated_atNc                     U R                   $ N)
created_at)ms    ZC:\Users\fernando.barreto\Documents\GitLab\ollama\chat-ollama\src\services\chat_service.py<lambda>6ChatService.get_conversation_history.<locals>.<lambda>   s    all    )keyc              3   J   #    U  H  oR                   (       d  M  Uv   M     g 7fr   is_user.0r   s     r   	<genexpr>7ChatService.get_conversation_history.<locals>.<genexpr>   s     .W/QYYqq/   #	#c              3   J   #    U  H  oR                   (       a  M  Uv   M     g 7fr   r   r   s     r   r    r!      s     /\?aR[R[?r"   u   Você: zAgente: r   zNenhuma mensagem.z ...    ...zN/A<   sr   zAgente DesconhecidonamezAgente z	Conversa )idtitlemodeldatepreviewmessageCountdurationu1   Erro crítico ao buscar histórico de conversas: u(   Erro interno ao processar o histórico: )$hasattrr
   r   descr   r   sessionqueryfilteruser_idr   r*   agent_idoptionsr   messagesorder_byallsortednextmessageappendjoinlentotal_secondsintgetr   r)   strr+   	isoformatr   now	Exceptionprint)r7   order_criterionr4   
user_chatshistory_listchatmessages_sortedfirst_user_message_objfirst_agent_message_objpreview_partsr.   preview_text!actual_first_message_for_durationlast_message_for_durationmessage_countduration_str	ts_iniciots_fimduration_secondsmodel_display_nameagent	chat_datehistory_itemes                           r   get_conversation_history$ChatService.get_conversation_history	   sh   E	K8?l8S8Sdoo224Y]YhYhYmYmYoOJJ$$T*11$,,,//2QRE#T]]h%>?z$--'@AJJ?[__aJL""(<R"S)-.W/.WY])^&*./\?/\^b*c' ").D.L.L!((73I3Q3Q2R)ST*/F/N/N!((84K4S4S3T)UV$<Koa088QdG%ll=9G:=g,:L 5RYUdOA4F4Q4Qjn1N]OB,?,J,Jcg) #O 4$49R AI6F V,2Y,>+M+M+O(+a/A1A+b0.12B.C-DA+FL.12Bb2H.I-J!+LL%:"==JJNN64==AE;B5&;Q;QV[V`V`UZZhopupxpxoyfz*/6t\/J/JtDOOdhdsds	 dgg,!ZZ@Ytwwi+@/5>I//1HLLND\D\D^+$1$6Q ,  ##L1q #t  %% 	KEc!fXNOA#a&JJJ	Ks   O?P 
P=&P82P=8P=c                     [        SU  35        [        S[        R                   35        [        [        R                  U [        R
                  " 5       S9n[        R                  R                  U5        [        R                  R                  5         [        SUR                   35        [        R                  R                  U 5      n[        SU(       a  UR                  OS  35        U(       aa  UR                  (       aP  UR                  R                  5       (       a1  [        S[!        UR                  S S 5       S35        [        S	5        O[        S
5        [        R                  R#                  5         [        S5        US 4$ ! [$         al  n[        S['        U5       35        SS Kn[        SUR+                  5        35        [        R                  R-                  5         S ['        U5      4s S nA$ S nAff = f)Nz<[DEBUG] ChatService.create_chat: Criando chat para agent_id=z1[DEBUG] ChatService.create_chat: current_user.id=)r6   r7   r   z4[DEBUG] ChatService.create_chat: Chat criado com ID=z4[DEBUG] ChatService.create_chat: Agente encontrado: zH[DEBUG] ChatService.create_chat: Agente possui mensagem de boas-vindas: 2   r%   uK   [DEBUG] ChatService.create_chat: Mensagem será mostrada apenas no frontenduK   [DEBUG] ChatService.create_chat: Agente não possui mensagem de boas-vindaszK[DEBUG] ChatService.create_chat: Chat criado com sucesso - Commit realizadoz5[ERROR] ChatService.create_chat: Erro ao criar chat: r   z,[ERROR] ChatService.create_chat: Traceback: )rI   r   r*   r
   r   rG   r   r3   addflushr   r4   rD   nomewelcome_messagestripreprcommitrH   rE   	traceback
format_excrollback)r7   rM   agenter^   rj   s        r   create_chatChatService.create_chatW   s   	 PQYPZ[\ElooEVWX$!#<<>D
 JJNN4 JJH	RS\\%%h/FHX^dhHijk&00V5K5K5Q5Q5S5S`aeflf|f|  ~A  A  gB  bC  aD  DG  H  IceceJJ_a: 	 I#a&RS@AUAUAW@XYZJJ!Q<	 s   F
F 
HA!G>8H>Hc           	          [        U UU[        R                  " 5       S9n[        R                  R                  U5        [        R                  R                  5         U(       a  SSKJn  U" SSU SUS S  3S9  [        R                  R                  U 5      nU(       Gd  U(       Ga  UR                  (       a  UR                  R                  5       S	:X  Ga  SS
KJn  [         R                  R!                  U S9R#                  [         R$                  5      R'                  S5      R)                  5       n[+        S U 5       S 5      n[+        S U 5       S 5      n	U(       a$  U	(       a  SUR,                   SU	R,                   3n
ONSR/                  U Vs/ s H1  oR0                  (       a  SUR,                   3OSUR,                   3PM3     sn5      n
SU
 3n U" 5       nUR3                  USSS9n[5        U[6        5      (       a  SU;   a  US   OS nU(       aD  UR                  5       R9                  SS5      Ul        [        R                  R                  5         O^UR;                  5       nSR/                  US S 5      [=        U5      S:  a  SOS	-   nUUl        [        R                  R                  5          US 4$ s  snf ! [>         a`    UR;                  5       nSR/                  US S 5      [=        U5      S:  a  SOS	-   nUUl        [        R                  R                  5          Nrf = f! [>         a5  n[        R                  RA                  5         S [C        U5      4s S nA$ S nAff = f)N)chat_idr>   r   r   r   )	log_auditzMensagem do usuario:rM   zMensagem enviada: i'  )actionobject_type	object_iddetails )GeminiService)rq   
   c              3   J   #    U  H  oR                   (       d  M  Uv   M     g 7fr   r   r   s     r   r    *ChatService.add_message.<locals>.<genexpr>   s     "Dh))11hr"   c              3   J   #    U  H  oR                   (       a  M  Uv   M     g 7fr   r   r   s     r   r    r{      s      FHqIIHr"   u
   Usuário: z
IA: 
zIA: u|   Dê um título curto e descritivo em português para esta conversa, considerando a mensagem do usuário e a resposta da IA:
(   zgemini-2.5-flash)
max_tokensr,   response r%   )"r   r   rG   r   r3   rc   ri   src.security.auditrr   r
   r4   rD   r+   rg   src.services.gemini_servicerx   	filter_byr:   r   limitr;   r=   r>   r@   r   generate_response
isinstancedictreplacesplitrA   rH   rl   rE   )rq   r>   r   chat_messagerr   rM   rx   r9   
first_userfirst_iacontextr   promptgemini_instanceresposta_ia	titulo_iawordsr+   r^   s                      r   add_messageChatService.add_messagex   s   0	 "#<<>	L JJNN<(JJ81 &%0%0AB	 ::>>'*DtTZZ4::;K;K;MQS;SE"==2272CLLWM_M_`ffgijnnp!"Dh"DdK
 FH FM( *:+=+=*>fXEUEUDVWG"iipx(ypxklYY:aii[)AVZ[\[d[dZeTf)fpx(yzG Y  Za  Yb  c(&3oO"1"C"CFWYas"C"tK;EkSW;X;X]gkv]vJ 7  }AI %.__%6%>%>tS%I


))+ ' #s 4UbVX Y%*


))+  %%' )z ! (#MMOEHHU3BZ0SZ"_ERTUE!&DJJJ%%'	(  	 JJ!Q<	 sc   FL4 8KL4 BK L4  AK =L4 L4 A'L1.L4 0L11L4 4
M3>*M.(M3.M3c                     [         R                  R                  [        R                  S9R                  [        [         R                  5      5      R                  [         R                  R                  5       5      R                  5       $ )N)r6   )r
   r4   r   r   r*   r8   r   r9   r:   r   r2   r;    r   r   get_user_chatsChatService.get_user_chats   sP    zz##LOO#<GJt}}56HT__1134SSU	;r   c           	         [         R                  R                  U [        R                  S9R                  [        [         R                  5      5      R                  5       nU(       d  SSK	J
n  U" S[        R                  SU SS S9  U$ )Nr*   r6   r   )send_discord_audit_logu   Acesso não autorizador
   u*   Tentativa de acesso ao chat sem permissão)rs   r6   rt   ru   rv   
ip_address)r
   r4   r   r   r*   r8   r   r9   firstsrc.discord.discord_webhookr   )rq   rM   r   s      r   get_chatChatService.get_chat   si    zz##w#HGJt}}56EG 	 J"/$"!D r   c                     [         R                  R                  U [        R                  S9R                  5       nU(       a>  [        R                  R                  U5        [        R                  R                  5         gg! [         a5  n[        R                  R                  5         S[        U5      4s S nA$ S nAff = f)Nr   )TN)Fu   Chat não encontradoF)r
   r4   r   r   r*   r   r   r3   deleteri   rH   rl   rE   )rq   rM   r^   s      r   delete_chatChatService.delete_chat   s    		!::''7LOO'LRRTD

!!$'

!!#!0 	!JJ!#a&= 	!s   A>B 
C*B<6C<Cperiod_daysc                     [         R                  " 5       [        U S9-
  n[        R                  R                  [        R                  " [        R                  5      5      R                  [        R                  [        R                  :H  [        R                  U:  5      R                  5       =(       d    Sn[        R                  R                  [        R                  " [        R                  5      5      R!                  [        [        R"                  [        R                  :H  5      R                  [        R                  [        R                  :H  [        R                  U:  5      R                  5       =(       d    Sn[        R                  R                  [        R$                  " [        R&                  5      5      R!                  [        [        R"                  [        R                  :H  5      R                  [        R                  [        R                  :H  [        R                  U:  [        R(                  S:H  [        R&                  R+                  S5      5      R                  5       nU(       a  [-        US5      OSnSn[        R                  R                  [        R"                  [        R                  " [        R                  5      R/                  S5      [        R$                  " [1        [        R(                  S:H  [        R&                  4SS95      R/                  S	5      5      R                  [        R                  U:  5      R3                  [        R"                  5      R5                  5       n[        R                  R                  [6        R8                  R/                  S
5      [        R                  " [        R                  5      R/                  S5      [        R:                  " UR<                  R>                  5      R/                  S5      [        R$                  " UR<                  R@                  5      R/                  S5      5      R!                  [6        [        RB                  [6        R                  :H  5      RE                  U[        R                  UR<                  R"                  :H  5      R                  [        R                  [        R                  :H  [        R                  U:  5      R3                  [6        R8                  5      RG                  5       n0 n	U Hu  n
U
RH                  =(       d    S[K        U
RL                  =(       d    S5      SU
RN                  (       a  [-        U
RN                  S5      OSS.XRP                  =(       d    S'   Mw     0 n[        R                  R                  [        RR                  " [        R                  5      R/                  S5      [        R                  " [        R                  5      R/                  S5      5      R                  [        R                  [        R                  :H  [        R                  U:  5      R3                  [        RR                  " [        R                  5      5      RU                  [        RR                  " [        R                  5      5      RG                  5       nU Hj  n
[W        U
RX                  S5      (       a  U
RX                  R[                  5       O[]        U
RX                  5      nX;  a  SSS.X'   U
R^                  X   S'   Ml     [        R                  R                  [        RR                  " [        R                  5      R/                  S5      [        R                  " [        R                  5      R/                  S5      5      R!                  [        [        R"                  [        R                  :H  5      R                  [        R                  [        R                  :H  [        R                  U:  5      R3                  [        RR                  " [        R                  5      5      RU                  [        RR                  " [        R                  5      5      RG                  5       nU Hj  n
[W        U
RX                  S5      (       a  U
RX                  R[                  5       O[]        U
RX                  5      nX;  a  SSS.X'   U
R`                  X   S'   Ml     UUUUU	UU S.nUS4$ ! [b         a.  n[e        S[]        U5       35        S[]        U5      4s SnA$ SnAff = f)ut   
Calcula as estatísticas para o dashboard.
period_days: O número de dias para considerar no período (ex: 7, 30).
)daysr   FN   g        message_count_for_chat)else_avg_response_time_for_chat
model_nameconversationsr9   avg_time)r   r9   tokensr   Desconhecidodaynum_conversationsrF   )r   r9   num_messages)total_conversationstotal_messagesavg_response_timetotal_tokensmodel_usageactivity_datar   u    Erro ao calcular estatísticas: )3r   rG   r	   r   r3   r4   r   countr
   r*   r5   r6   r   r   scalarr   r@   rq   avgresponse_timer   isnotroundlabelr   group_bysubqueryr   r)   sumcr   r   r7   	outerjoinr;   r   rC   r9   r   r   r-   r:   r1   r   rF   rE   r   r   rH   rI   )r   
start_dater   r   avg_response_time_queryr   r   messages_subquerymodel_usage_querymodel_usage_dictrowr   daily_conversationsday_strdaily_messagesstats_resultr^   s                    r   get_dashboard_statsChatService.get_dashboard_stats   sB   
Z	 !)*EEJ"$**"2"24::dgg3F"G7J9VW#    ZZ--djj.DEdGOOtww6779K9Kz9YZ  
 ')jj&6&6txx@U@U7V&WdGOOtww67LLLOO3&&*4OOu,))//5	  $ F]&=q AbeL "

 0 0

7::&,,-EFw%79N9NOW[\]cc  eA  B! fW'':56xx7PQYQYQ[	  !#

 0 0!!,/

477#))/:*,,CCDJJ:V*,,GGHNNzZ	!
 d64==FII56i)4776G6I6I6Q6Q+QRfT\\\__4doo6SThv{{#ce   "(%(%6%6%;! #CLL$5A 6:=,,cllA 6C	F !A>B ) M"$**"2"2		$//*007

477#))*=># f/:- htyy1288DIIdoo<V3WX[X[X]   +18+1N1N#''++-TWX[X_X_T`/\]klJm1G:=:O:O&7 +
  ZZ--		',,-33E:

7::&,,^< d4DGG34f/""j0 htyy!3!345hhtyyI[I[?\6]^a^a^c  &18+1N1N#''++-TWX[X_X_T`/\]klJm1G585E5E&z2 & (;"0%6 ,/!.*L  %% 	 4SVH=>Q<	 s   d6d9 9
e1#e,&e1,e1r   r   )T)   )__name__
__module____qualname____firstlineno__staticmethodr_   rn   r   r   r   r   rC   r   __static_attributes__r   r   r   r   r      s    JK JKZ    @ 1  1 f ; ;
    
! 
!_  _  _ r   r   N)src.extensionsr   
sqlalchemyr   r   flask_loginr   sqlalchemy.ormr   r   r	   
src.modelsr
   r   r   r   r   r   r   <module>r      s&     ! $ % ( , ,g  g r   