
    Ii8                     p    d dl mZ d dlmZmZ d dlmZ d dlmZ d dl	m	Z	m
Z
 d dlmZmZmZ  G d d      Zy	)
    )db)casefunc)current_user)
joinedload)datetime	timedelta)ChatMessageAgentec                   ~    e Zd Zed
d       Zed        Zedd       Zed        Zed        Zed        Z	dde
fd	Zy)ChatServiceNc           	         	 t        t        d      rt        j                  j                         nt        j                  j                         }t
        j                  j                  t              j                  t        j                  t        j                  k(        }| "|j                  t        j                  | k(        }|j                  t        t        j                              j!                  |      j#                         }g }|D ]|  }t%        |j                  d       }t'        d |D        d      }t'        d |D        d      }g }	|r*|j(                  r|	j+                  d|j(                          |r*|j(                  r|	j+                  d|j(                          |	s|r|d	   j(                  nd
}
ndj-                  |	      }
t/        |
      dkD  r|
dd dz   n|
}|r|d	   j                  nd}|r|d   j                  nd}t/        |      }d}|rI|rG|}|}|rA|r?||z
  j1                         }|d	k  rd	}|dk  rt3        |       d}nt3        |dz         d}d}|j                  rct
        j                  j5                  t6        |j                        }|r3t        |d      r|j8                  r|j8                  nd|j                   }t        t        d      r|j                  r|j                  n|j                  }t;        |j                        |j<                  xs d|j                   ||r|j?                         n!tA        jB                         j?                         ||xs d	|d}|j+                  |        |dfS # tD        $ r1}tG        dt;        |              g dt;        |       fcY d}~S d}~ww xY w)u   
        Busca o histórico de conversas para o usuário logado e agente específico (se fornecido),
        estruturado para o frontend.
        
updated_atNc                     | j                   S N)
created_at)ms    8/srv/www/ollama/chat-ollama/src/services/chat_service.py<lambda>z6ChatService.get_conversation_history.<locals>.<lambda>   s
    all     )keyc              3   :   K   | ]  }|j                   s|  y wr   is_user.0r   s     r   	<genexpr>z7ChatService.get_conversation_history.<locals>.<genexpr>   s     .WQQYYq.W   c              3   :   K   | ]  }|j                   r|  y wr   r   r   s     r   r   z7ChatService.get_conversation_history.<locals>.<genexpr>   s     /\aRSR[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)r4   order_criterionr1   
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_historyz$ChatService.get_conversation_history	   sd   E	K8?l8Sdoo224Y]YhYhYmYmYoOJJ$$T*11$,,,//2QRE#T]]h%>?z$--'@AJJ?[__aJL" 82"(<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&;QV[V`V`UZZhopupxpxoyfz*/6t\/JtDOOdhdsds	 dgg,!ZZ@Ytwwi+@/5>I//1HLLND\D\D^+$1$6Q ,  ##L1q82t  %% 	KEc!fXNOA#a&JJJ	Ks   NN 	O
&O?O
O
c                    	 t        d|         t        dt        j                          t        t        j                  | t	        j
                               }t        j                  j                  |       t        j                  j                          t        d|j                          t        j                  j                  |       }t        d|r|j                  nd         |rW|j                  rK|j                  j                         r1t        dt!        |j                  d d        d       t        d	       nt        d
       t        j                  j#                          t        d       |d fS # t$        $ rl}t        dt'        |              dd l}t        d|j+                                 t        j                  j-                          d t'        |      fcY d }~S d }~ww xY w)Nz<[DEBUG] ChatService.create_chat: Criando chat para agent_id=z1[DEBUG] ChatService.create_chat: current_user.id=)r3   r4   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: )rF   r   r'   r
   r   rD   r   r0   addflushr   r1   rA   nomewelcome_messagestripreprcommitrE   rB   	traceback
format_excrollback)r4   rJ   agenter[   rf   s        r   create_chatzChatService.create_chatW   s   	 PQYPZ[\ElooEVWX$!#<<>D
 JJNN4 JJH	RS\\%%h/FHX^dhHijk&00V5K5K5Q5Q5S`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   E8E; ;	G0A!G+%G0+G0c           	         	 t        | ||t        j                               }t        j                  j                  |       t        j                  j                          |rddlm}  |dd| d|d d         t        j                  j                  |       }|s|r|j                  r|j                  j                         d	k(  rdd
lm} t         j                  j!                  |       j#                  t         j$                        j'                  d      j)                         }t+        d |D        d       }t+        d |D        d       }	|r|	rd|j,                   d|	j,                   }
nGdj/                  |D cg c],  }|j0                  rd|j,                   nd|j,                   . c}      }
d|
 }	  |       }|j3                  |dd      }t5        |t6              r	d|v r|d   nd }|rD|j                         j9                  dd      |_        t        j                  j                          n\|j;                         }dj/                  |d d       t=        |      dkD  rdnd	z   }||_        t        j                  j                          |d fS c c}w # t>        $ r_ |j;                         }dj/                  |d d       t=        |      dkD  rdnd	z   }||_        t        j                  j                          Y pw xY w# t>        $ r5}t        j                  jA                          d tC        |      fcY d }~S d }~ww xY w)N)chat_idr;   r   r   r   )	log_auditzMensagem do usuario:rJ   zMensagem enviada: i'  )actionobject_type	object_iddetails )GeminiService)rl   
   c              3   :   K   | ]  }|j                   s|  y wr   r   r   s     r   r   z*ChatService.add_message.<locals>.<genexpr>   s     "D!))1"Dr   c              3   :   K   | ]  }|j                   r|  y wr   r   r   s     r   r   z*ChatService.add_message.<locals>.<genexpr>   s      FqAII Fr   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   rD   r   r0   r_   re   src.security.auditrm   r
   r1   rA   r(   rc   src.services.gemini_servicers   	filter_byr7   r   limitr8   r:   r;   r=   r   generate_response
isinstancedictreplacesplitr>   rE   rh   rB   )rl   r;   r   chat_messagerm   rJ   rs   r6   
first_userfirst_iacontextr   promptgemini_instanceresposta_ia	titulo_iawordsr(   r[   s                      r   add_messagez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(yklQYY:aii[)AVZ[\[d[dZeTf)f(yzG Y  Za  Yb  c(&3oO"1"C"CFWYas"C"tK;EkSW;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<	 sV   E=L	 ?1J0L	 =CJ L	 L	 A%LL	 LL	 		M*M<MMc                     t         j                  j                  t        j                        j                  t        t         j                              j                  t         j                  j                               j                         S )N)r3   )r
   r1   r~   r   r'   r5   r   r6   r7   r   r/   r8    r   r   get_user_chatszChatService.get_user_chats   sP    zz##LOO#<GJt}}56HT__1134SSU	;r   c                    t         j                  j                  | t        j                        j                  t        t         j                              j                         }|s"ddl	m
}  |dt        j                  d| dd        |S )Nr'   r3   r   )send_discord_audit_logu   Acesso não autorizador
   u*   Tentativa de acesso ao chat sem permissão)rn   r3   ro   rp   rq   
ip_address)r
   r1   r~   r   r'   r5   r   r6   firstsrc.discord.discord_webhookr   )rl   rJ   r   s      r   get_chatzChatService.get_chat   si    zz##w#HGJt}}56EG 	 J"/$"!D r   c                    	 t         j                  j                  | t        j                        j                         }|r>t        j                  j                  |       t        j                  j                          yy# t        $ r5}t        j                  j                          dt        |      fcY d }~S d }~ww xY w)Nr   )TN)Fu   Chat não encontradoF)r
   r1   r~   r   r'   r   r   r0   deletere   rE   rh   rB   )rl   rJ   r[   s      r   delete_chatzChatService.delete_chat   s    		!::''7LOO'LRRTD

!!$'

!!#!0 	!JJ!#a&= 	!s   A<B   	B>	*B93B>9B>period_daysc           
      p   	 t        j                         t        |       z
  }t        j                  j                  t        j                  t        j                              j                  t        j                  t        j                  k(  t        j                  |k\        j                         xs d}t        j                  j                  t        j                  t        j                              j!                  t        t        j"                  t        j                  k(        j                  t        j                  t        j                  k(  t        j                  |k\        j                         xs d}t        j                  j                  t        j$                  t        j&                              j!                  t        t        j"                  t        j                  k(        j                  t        j                  t        j                  k(  t        j                  |k\  t        j(                  dk(  t        j&                  j+                  d            j                         }|rt-        |d      nd}d}t        j                  j                  t        j"                  t        j                  t        j                        j/                  d      t        j$                  t1        t        j(                  dk(  t        j&                  fd            j/                  d	            j                  t        j                  |k\        j3                  t        j"                        j5                         }t        j                  j                  t6        j8                  j/                  d
      t        j                  t        j                        j/                  d      t        j:                  |j<                  j>                        j/                  d      t        j$                  |j<                  j@                        j/                  d            j!                  t6        t        jB                  t6        j                  k(        jE                  |t        j                  |j<                  j"                  k(        j                  t        j                  t        j                  k(  t        j                  |k\        j3                  t6        j8                        jG                         }i }	|D ]a  }
|
jH                  xs dtK        |
jL                  xs d      d|
jN                  rt-        |
jN                  d      ndd|	|
jP                  xs d<   c i }t        j                  j                  t        jR                  t        j                        j/                  d      t        j                  t        j                        j/                  d            j                  t        j                  t        j                  k(  t        j                  |k\        j3                  t        jR                  t        j                              jU                  t        jR                  t        j                              jG                         }|D ]e  }
tW        |
jX                  d      r|
jX                  j[                         nt]        |
jX                        }||vrddd||<   |
j^                  ||   d<   g t        j                  j                  t        jR                  t        j                        j/                  d      t        j                  t        j                        j/                  d            j!                  t        t        j"                  t        j                  k(        j                  t        j                  t        j                  k(  t        j                  |k\        j3                  t        jR                  t        j                              jU                  t        jR                  t        j                              jG                         }|D ]e  }
tW        |
jX                  d      r|
jX                  j[                         nt]        |
jX                        }||vrddd||<   |
j`                  ||   d<   g |||||	|| d}|dfS # tb        $ r.}te        dt]        |              dt]        |      fcY d}~S d}~ww xY w)u   
        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conversationsr6   avg_time)r   r6   tokensr   Desconhecidodaynum_conversationsrC   )r   r6   num_messages)total_conversationstotal_messagesavg_response_timetotal_tokensmodel_usageactivity_datar   u    Erro ao calcular estatísticas: )3r   rD   r	   r   r0   r1   r   countr
   r'   r2   r3   r   r   scalarr   r=   rl   avgresponse_timer   isnotroundlabelr   group_bysubqueryr   r&   sumcr   r   r4   	outerjoinr8   r   r@   r6   r   r   r*   r7   r.   r   rC   rB   r   r   rE   rF   )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_statszChatService.get_dashboard_stats   s]   
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]   + P18+1N#''++-TWX[X_X_T`-/\]klJmw1G:=:O:Og&7P
  ZZ--		',,-33E:

7::&,,^< d4DGG34f/""j0 htyy!3!345hhtyyI[I[?\6]^a^a^c  & F18+1N#''++-TWX[X_X_T`-/\]klJmw1G585E5Eg&z2F (;"0%6 ,/!.*L  %% 	 4SVH=>Q<	 s   c;c> >	d5#d0*d50d5r   )T)   )__name__
__module____qualname__staticmethodr\   rj   r   r   r   r   r@   r   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   