o
    �v•j–#  ã                   @   sV  d dl mZ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 d dlmZ d dlmZ d dlmZmZmZmZmZmZmZ d dlmZ d d	lmZ ed
dgd�ZG dd„ deƒZG dd„ deƒZG dd„ deƒZej deej!d�eeƒfdede"dB fdd„ƒZ#ej dej!d�defdd„ƒZ$ej dej!d�eeƒfdede"dB fdd „ƒZ%dS )!é    )Ú	APIRouterÚstatusÚHTTPExceptionÚDepends)Ú	BaseModelÚField)Úget_session_by_idÚclaim_session_atomically)Úget_or_create_conversation)Úcreate_message)Úget_database)Úactive_sessionsÚbroadcast_to_agentsÚnotify_visitor_socketÚupdate_active_session_statusÚremove_active_sessionÚcancel_grace_period_timerÚset_agent_status)Úupdate_session_status)Úget_current_agent_optionalz/api/v1/handoffÚhandoff)ÚprefixÚtagsc                   @   sB   e Zd ZU eddd�Zeed< dZedB ed< dZedB ed< dS )ÚHandoffActionRequest.é   ©Ú
min_lengthÚ	sessionIdNÚagentIdÚendedBy)	Ú__name__Ú
__module__Ú__qualname__r   r   ÚstrÚ__annotations__r   r   © r%   r%   ú4/web/html/dev/chatbot/backend/app/routers/handoff.pyr      s   
 r   c                   @   s.   e Zd ZU eed< eed< dZedB ed< dS )ÚHandoffActionResponser   r   NÚassignedAgentId)r    r!   r"   r#   r$   r(   r%   r%   r%   r&   r'      s   
 r'   c                   @   sF   e Zd ZU eddd�Zeed< eddd�Zeed< dZedB ed< dS )ÚAgentMessageRequest.r   r   r   ÚmessageNr   )	r    r!   r"   r   r   r#   r$   r*   r   r%   r%   r%   r&   r)      s   
 r)   z/accept)Úresponse_modelÚstatus_codeÚpayloadÚauthenticated_agentNc                 Ã   s0  �t ƒ }| j}|r| d¡r|d }|sd}t|| jƒI d H }|s-ttjd| j› d�d�‚t|| j|ƒI d H }|s@ttj	dd�‚t
| jdƒ t|dƒ | jtv ra|t| j d	< | d
¡t| j d
< | dd¡}td| j|d|dœƒI d H  td| j|d|dœƒI d H  t| jdd|dœƒI d H  t| jd|d�S )Nr   Úagent_1ú!Session not found for sessionId 'ú'©r,   Údetailz-Chat session already claimed by another agentÚIN_CHATÚBUSYr(   Ú
assignedAtÚsiteIdÚ Úchat_claimed)Útyper   r7   r   r(   Úvisitor_acceptedÚstatus_changed)r:   r   r(   )r   r   r(   )r   r   Úgetr   r   r   r   ÚHTTP_404_NOT_FOUNDr	   ÚHTTP_409_CONFLICTr   r   r   r   r   r'   )r-   r.   ÚdbÚclaiming_agent_idÚsessionÚclaimed_docÚsite_idr%   r%   r&   Úaccept_visitor$   sb   €þþ

ûû	ýýrE   z/end)r,   c           
   
   Ã   sš  �t ƒ }t|| jƒI d H }|sttjd| j› d�d�‚| jdv r#| jnd}t|| jdƒI d H  t| jd|d� | 	dd	¡}t
|| j|ƒI d H }|d
  d|d idd|dœi¡I d H  td| j|d|dœƒI d H  t| jdd|dœƒI d H  ddlm} || jdd�I d H  t| jƒ zddlm} ||| j|d�I d H  W n' tyÅ } zdd l}	|	 t¡jd| j› d|› �dd� W Y d }~nd }~ww | jd|dœS )Nr0   r1   r2   )ÚvisitorÚagentrF   ÚENDED)Úended_byr7   r8   ÚconversationsÚconversationIdz$setÚended)r   r   Ú
chat_ended)r:   r   r7   r   r   r<   )r:   r   r   r   )Úterminate_video_call)Úreason)Ú"send_conversation_transcript_emailz2Error triggering transcript email on end_chat for z: T)Úexc_info)r   r   r   )r   r   r   r   r   r>   r   r   r   r=   r
   Ú
update_oner   r   Úapp.services.video_signalingrN   r   Úapp.services.email_servicerP   Ú	ExceptionÚloggingÚ	getLoggerr    Úerror)
r-   r@   rB   rI   rD   ÚconversationrN   rP   Ú	email_errrV   r%   r%   r&   Úend_chatj   sX   €þ

þûý

þ€þr[   z/messagec                 Ã   s’  �t ƒ }t|| jƒI d H }|sttjd| j› d�d�‚| dd¡}t | ji ¡}| d¡}| d¡}|p5|}|dkrFttjd| j› d�d�‚| j	}	|rT| d	¡rT|d	 }	| d
¡p]| d
¡}
|
rm|	rm|
|	krmttj
dd�‚t|| j|ƒI d H }|d }|	pŒ|
pŒ|r†| d	¡nd pŒ| d
¡}t||| jd| j|d�I d H }t| jd| j|d | jdœƒI d H  td| j||
p¶|	|d | jdœƒI d H  | j| jdœS )Nr0   r1   r2   r7   r8   r   rH   z)Cannot send message to an ended session 'r   r(   z You do not own this chat sessionrK   rG   )Úconversation_idÚ
session_idÚroleÚcontentÚagent_idÚagent_messageÚ	messageId)r:   r   rb   r*   )r:   r   r7   r(   rb   r*   )r   Úreply)r   r   r   r   r   r>   r=   r   ÚHTTP_400_BAD_REQUESTr   ÚHTTP_403_FORBIDDENr
   r   r*   r   r   )r-   r.   r@   rB   rD   Úin_memory_sessionÚin_memory_statusÚ	db_statusÚcurrent_statusÚclaiming_agentÚassigned_agentrY   r\   Úsending_agent_idÚmsg_docr%   r%   r&   Úsend_agent_message§   sj   €þ

þþ$ú
üú	rn   )&Úfastapir   r   r   r   Úpydanticr   r   Ú#app.repositories.session_repositoryr   r	   Ú(app.repositories.conversation_repositoryr
   Ú#app.repositories.message_repositoryr   Úapp.databaser   Úapp.services.presencer   r   r   r   r   r   r   r   Úapp.dependencies.authr   Úrouterr   r'   r)   ÚpostÚHTTP_200_OKÚdictrE   r[   rn   r%   r%   r%   r&   Ú<module>   s:    $	þÿþE<þÿþ