o
    =)j1                     @   s6  d dl Z d dlZd dlZd dlmZmZ d dlmZmZmZ d dl	m
Z
 d dlZeeZi ddddddddd	d	d
d
ddddddddddddddddddddZedZdedefddZdedededefddZdee fddZd eeef dee fd!d"ZG d#d$ d$ZdS )%    N)datedatetime)AnyDictOptional	urlencodesummary
transcriptquality_score	sentimentcall_purposeobjection_typeobjections_concernsparameter_scorestotal_possible_scoretalk_listen_ratio
agent_namecall_starttimecall_durationanalysis_statuscall_idphone_numberz\{\{\s*([a-zA-Z0-9_]+)\s*\}\}valuereturnc                 C   s`   t | ttfr|  S t | tr.|  }|r.|d dv r.zt|W S  ty-   |  Y S w | S )Nr   z[{)	
isinstancer   r   	isoformatstrstripjsonloads	Exception)r   stripped r#   ;/home/aiteam/pcaa-dev/dashboard-backend/api_push_service.py
_json_safe#   s   
r%   urlkeyc                 C   s(   d| v rdnd}|  | t ||i S )N?&r   )r&   r'   r   	separatorr#   r#   r$   _append_query0   s   r+   c                 C   sr   | d u rd S t | tr| jr| jd dS | S ztt| dd}|jr,|jd dW S |W S  ty8   Y d S w )N)tzinfoZz+00:00)r   r   r,   replacefromisoformatr   r!   )r   parsedr#   r#   r$   _parse_effective_at5   s   
r1   	call_datac                 C   s   |  dp	|  d}t|S )Nr   
call_start)getr1   )r2   rawr#   r#   r$   _call_start_datetimeA   s   r6   c                   @   sN  e Zd Zdd Z			d"dededeeeef  d	ed
edeeef fddZ	dd Z
dededeeef deeef deeef f
ddZdeeef deeef defddZdeeef deeef deeef fddZdedeeef defddZdeeef deeef deeef fddZdeeef dedefd d!ZdS )#ApiPushServicec                 C   s
   || _ d S )N)
db_handler)selfr8   r#   r#   r$   __init__G   s   
zApiPushService.__init__Nanalytics_savedFbidcallidanalytics_datatrigger_eventforcer   c                 C   s  | j j|dd}|sddddS |s|dsddddS |dr1|d|kr1|s1ddd	dS |s@| j ||r@ddd
dS |dpFd }|sU| ||||i dS | j ||p]i }|syt|d}	t|}
|	ry|
ry|
|	k ryddddS | 	||||pi }t
|dpd }| ||}|dvr|s| ||||i d| S | ||}| |||\}}t
|dpd }tdtt|dpdd}t
|dpd pd}||d< |dvr|ddkr|||dp|dpd< zKtj|||||d }d!|j  kod"k n  }| j j||||d|||||j|jd d# ||r/d n|jd d$ d% ||j|jd d$ |d&W S  ty} } z+td'||| | j j||||d||||dt
|d(
 dt
||d)W  Y d }~S d }~ww )*NT)include_secretsFzAPI push is not configured)successskippedmessage
is_enabledzAPI push is disabledr?   zTrigger does not match configzAlready pushed successfullyendpoint_url zEndpoint URL is missingapi_push_effective_atz%Call predates API push effective datemapping_keyphonenonerG   zMapping value missing for http_methodPOST   timeout_seconds      content_typeapplication/jsonContent-Typemapping_locationbodymapping_name)r   headerstimeout   i,  i  i  )r<   r=   r?   rI   mapping_valuerF   rM   payloadresponse_statusresponse_bodyrB   error_message)rB   status_coder_   r]   z(API push failed for bid=%s callid=%s: %s)
r<   r=   r?   rI   r\   rF   rM   r]   rB   r`   )rB   errorr]   )r8   get_api_push_configr4   api_push_already_succeededr   _log_and_returnget_raw_call_detailsr1   r6   _merge_call_datar   lower_mapping_value_build_payload_build_requestuppermaxminintrequestsrequestra   log_api_push_attempttextr!   loggerwarning)r9   r<   r=   r>   r?   r@   configrF   r2   effective_atr3   mergedrI   r\   r]   r&   rY   methodrZ   rS   responserB   excr#   r#   r$   push_call_updateJ   s   	zApiPushService.push_call_updatec                 C   s:   | j j||||d|d|d|d|d	 d|dS )NrI   rF   rM   F)	r<   r=   r?   rI   rF   rM   r]   rB   r`   )rB   rb   )r8   rr   r4   )r9   rv   r<   r=   r?   r]   rb   r#   r#   r$   re      s   
zApiPushService._log_and_returnr2   c           	      C   s   | dp| dp| dpd}| dp| dpd}| d}| dp-| dp-d}i ||t||||||| d	pD| d
| dpM| d|d urVdd	S dd	S )Ncustomer_callinfocustomer_phone
lead_phonerG   transcriptsr
   r   r	   	agentnamer   durationduration_secondsfull_analysissummary_only)	r<   r   r   r
   r	   r   r   r   r   )r4   r   )	r9   r<   r=   r2   r>   r   r
   r   r	   r#   r#   r$   rg      s6   


zApiPushService._merge_call_datarv   rx   c                 C   sN   t |dpd }|dv rdS |dkrt |dpdS t |dp%dS )NrI   rJ   rK   rG   r   r   )r   r4   rh   )r9   rv   rx   rI   r#   r#   r$   ri      s   zApiPushService._mapping_valuec           	      C   s   | dpdg}| dpi }t| d}i }|D ]$}|tvr!qt| t| }|s5|d dg i fv r5q||| |p=|< q|S )Nselected_fieldsr	   field_mappingsinclude_empty_fieldsrG   )r4   boolAPI_PUSH_FIELDSr%   )	r9   rv   rx   r   r   include_emptyr]   fieldr   r#   r#   r$   _build_flat_payload   s   z"ApiPushService._build_flat_payloadr   c                 C   s   t ||}t||}|d u rdS t|ttfr!tj|ddS t|tr,|r*dS dS t|t	t
fr7t|S tjt|ddS )NnullF)ensure_asciitruefalse)r   r4   r%   r   dictlistr   dumpsr   ro   floatr   )r9   r   rx   
source_keyr   r#   r#   r$   _render_template_value   s   
z%ApiPushService._render_template_valuec              
      s  t |dpd }| }|dkr5t |dpd p!d}d dd dd d||iS |d	krt |d
p@d }|sH|S dtjdt f fdd}t||}zt	
|}	t|	tri|	W S W |S  ty }
 ztd|
 W Y d }
~
|S d }
~
ww |S )Npayload_format	flat_jsonwrapped_jsonpayload_wrapper_keydatar<   r   r   custom_templatepayload_templaterG   matchr   c                    s    | d S )NrO   )r   group)r   rx   r9   r#   r$   _replace
  s   z/ApiPushService._build_payload.<locals>._replacez)Invalid custom API push template JSON: %s)r   r4   rh   r   r   reMatch_TEMPLATE_PATTERNsubr   r    r   r   r!   rt   ru   )r9   rv   rx   r   flat_payloadwrapper_keytemplater   renderedr0   r{   r#   r   r$   rj      s6   




zApiPushService._build_payloadrF   r\   c           
      C   s(  t |dpd }|dp|dpd}|}|dvr-|r-|d|d|d|}dd	i}||d
p9i  |d}|dkrS|drSd|d  |d< n|dkri|dri|dri|d ||d < |dv so|ss||fS |dpyd}	|	dkrt|||}||fS |	dkr|||< ||fS )NrI   rJ   rX   rK   z{mapping_value}z{phone}z	{call_id}rU   rT   custom_headers	auth_typebearer
auth_tokenzBearer Authorizationapi_keyapi_key_nameapi_key_valuerV   queryheader)r   r4   rh   r.   updater+   )
r9   rv   rF   r\   rI   rX   r&   rY   r   rV   r#   r#   r$   rk     s2   
zApiPushService._build_request)Nr;   F)__name__
__module____qualname__r:   r   r   r   r   r   r|   re   rg   ri   r   r   rj   rk   r#   r#   r#   r$   r7   F   sF    

_



&.." r7   )r   loggingr   r   r   typingr   r   r   urllib.parser   rp   	getLoggerr   rt   r   compiler   r%   r   r+   r1   r6   r7   r#   r#   r#   r$   <module>   s^    
	

