o
    j1                     @   s@   d dl Z d dlmZmZmZ d dlZe eZG dd dZ	dS )    N)AnyDictOptionalc                   @   s@  e Zd ZdZ		d@dededee defdd	Zd
eeef fddZ			dAdededeeee
f  deeee
f  d
eee
f f
ddZd
eee
f fddZdeee
f d
eee
f fddZded
eee
f fddZded
eee
f fddZdeee
f d
eee
f fdd Zdedeee
f d
eee
f fd!d"Zded
eee
f fd#d$Z	%	&	'dBd(ed)ed*ed+ed,ed
eee
f fd-d.Zed/e
d
efd0d1Zd2eee
f d3ed
efd4d5Zded
eee
f fd6d7Zd8ed
eee
f fd9d:Zd;eee
f d
eee
f fd<d=ZdAdee d8ee d
eee
f fd>d?ZdS )CLeadSquaredServicezNPython port of LeadSquared integration service used in tatsat2dev/leadsquared.N   
access_key
secret_keyapi_hosttimeoutc                 C   s:   |pd  | _|p
d  | _|pdd| _t|| _d S )N z$https://api-in21.leadsquared.com/v2//)stripr   r   rstripr	   intr
   )selfr   r   r	   r
    r   leadsquared_service.py__init__   s   zLeadSquaredService.__init__returnc                 C   s   | j | jdS )N)	accessKey	secretKey)r   r   )r   r   r   r   _auth_params   s   zLeadSquaredService._auth_paramsmethodendpointquery_paramspayloadc              
   C   s  | j r| jsddd dS | j d|d }|  }|r"|| zxtj| |||| j	d}|j
rz| }W n tyG   d|ji}Y nw t|trzt|dpTd d	krz|d
pf|dpf|j}	td|||j dd|	 |dW S dd|dW S td|||j|j dd|j d|j d dW S  ty }
 ztjd|
dd ddt|
 d dW  Y d }
~
S d }
~
ww )NFz#LeadSquared credentials are missingsuccessmessagedatar   )r   urlparamsjsonr
   rawStatusr   errorExceptionMessageMessagez5LeadSquared API returned error payload: %s %s body=%szLeadSquared API error: TzRequest successfulz7LeadSquared API request failed: %s %s status=%s body=%szLeadSquared API error (z): z!LeadSquared request exception: %s)exc_infozException: )r   r   r	   lstripr   updaterequestsrequestupperr
   okr"   	Exceptiontext
isinstancedictstrgetlowerloggerr%   status_code)r   r   r   r   r   r    r!   responseparsedr   excr   r   r   _request   st   
$zLeadSquaredService._requestc                 C   sb   |  ddddi}|dr&dd| jr| jd d  d	nd
| jddS dd|d dS )NPagingr      OffsetRowCountr   Tz!LeadSquared connection successful
   z...r   )r   r	   )r   r   credentialsFzLeadSquared connection failed: r   )r   r   )search_leadsr4   r   r	   )r   resultr   r   r   test_connectionh   s"   
	z"LeadSquaredService.test_connectionsearch_paramsc                 C      | j dd|pi dS )NPOSTLeadManagement.svc/Leads.Getr   r   r   r;   )r   rF   r   r   r   rC      
   zLeadSquaredService.search_leadslead_idc                 C   s   | j dddt|idS )NGETz LeadManagement.svc/Leads.GetByIdidr   r   r   r;   r3   r   rM   r   r   r   get_lead   s
   
zLeadSquaredService.get_leadphonec                 C   s   | j ddd|idS )NrN   z,LeadManagement.svc/RetrieveLeadByPhoneNumberrT   rP   rK   )r   rT   r   r   r   get_lead_by_phone_number   rL   z+LeadSquaredService.get_lead_by_phone_number	lead_datac                 C   rG   )NrH   zLeadManagement.svc/Lead.CreaterJ   rK   )r   rV   r   r   r   create_lead   rL   zLeadSquaredService.create_leadc                 C   s   | j dddt|i|pi dS )NrH   zLeadManagement.svc/Lead.UpdateleadIdr   r   r   r   rQ   )r   rM   rV   r   r   r   update_lead   s   
zLeadSquaredService.update_leadc                 C   s   | j dddt|ii dS )NrH   zLeadManagement.svc/Lead.DeleterX   rY   rQ   rR   r   r   r   delete_lead   s   
zLeadSquaredService.delete_leadr      
ModifiedOnfrom_date_strto_date_stroffset	row_count
date_fieldc                 C   s:   |d|d|d|dgdd||dd}| j dd	|d
S )a  Fetch leads whose `date_field` falls within [from_date_str, to_date_str].

        Uses Leads.Get with AdvancedSearch so it works on all LSQ account tiers.
        Pagination is offset-based (Offset / RowCount) matching Leads.Get convention.
        `date_field` can be 'ModifiedOn' (default) or 'CreatedOn'.

        On a fresh / first-run call, pass a very old from_date to retrieve all
        historical leads.
        GreaterOrEqualToField	ConditionValueLessOrEqualToAND
ConditionsOperatorr>   AdvancedSearchr<   rH   rI   rJ   rK   )r   r^   r_   r`   ra   rb   r   r   r   r   get_leads_in_date_range   s(   z*LeadSquaredService.get_leads_in_date_rangevaluec                 C   s   d dd t| p	dD S )z1Return only digit characters from a phone string.r   c                 s   s    | ]	}|  r|V  qd S )N)isdigit).0chr   r   r   	<genexpr>   s    z3LeadSquaredService._phone_digits.<locals>.<genexpr>)joinr3   )rp   r   r   r   _phone_digits   s   z LeadSquaredService._phone_digitsleadquery_digitsc                 C   sv   t |dkr|dd n|}dD ](}||}|sq| |}t |dkr+|dd n|}||ks5||kr8 dS qdS )aS  Return True if any phone field on the lead contains `query_digits` as a suffix.

        LSQ stores phones with country-code prefixes (+91-XXXXXXXXXX).  We
        normalise both sides to digits and check that either the query is a
        suffix of the stored number or vice-versa (handles 10-digit vs
        12-digit variants).
        rA   N)PhoneMobilePhoneNumberTF)lenr4   rv   )r   rw   rx   corefield
stored_rawstoredstored_corer   r   r   _lead_matches_phone   s   

z&LeadSquaredService._lead_matches_phonec                 C   s  |  |}|sddd dS t|dkr|dd  n|}tt||g}|D ]>}| |}|ds3q&|d}t|tr?|n	t|trG|gng }|D ]}	t|	trc| |	|rcdd	|	gd    S qKq&g }
|D ]"}|
d
dd|dgiddddd
dd|dgiddddg7 }
qi|
d|dddddd|dddddg7 }
|
D ]R}| 	|}|dsq|d}g }t|tr|}nt|tr|dp|dp|dp|dpg }|D ]}	t|	tr| |	|rdd	|	gd    S qqddd dS )NFzPhone is requiredr   rA   ry   r   r   T
Lead foundrk   rz   Equalrd   r      r>   rm   r{   )SearchByrg   )	Parameterr<   ListDatalistz#No LeadSquared lead found for phone)
rv   r}   r   r2   fromkeysrU   r4   r1   r   rC   )r   rT   
normalizedr~   search_valuesvalrD   r   rowsrw   payloadsr   r   r   r   search_lead_by_phone   sl   



"




z'LeadSquaredService.search_lead_by_phoneemailc                 C   s   |sddd dS dd|  dgddd	d
dd}| |}|ds&|S |d}g }t|tr5|}nt|trP|dpO|dpO|dpO|dpOg }|rXdd|dS ddd dS )NFzEmail is requiredr   EmailAddressr   rd   ri   rj   r   r   r>   rm   r   r   r   r   r   Tr   z#No LeadSquared lead found for email)r   rC   r4   r1   r   r2   )r   r   r   rD   r   r   r   r   r   search_lead_by_email0  s(   
	



,z'LeadSquaredService.search_lead_by_emailactivity_datac                 C   rG   )NrH   zProspectActivity.svc/CreaterJ   rK   )r   r   r   r   r   create_activityL  rL   z"LeadSquaredService.create_activityc                 C   s(   |r|  |S |r| |S ddd dS )NFz3Phone or email is required to search for a prospectr   )r   r   )r   rT   r   r   r   r   search_prospectS  s
   

z"LeadSquaredService.search_prospect)Nr   )NN)r   r\   r]   )__name__
__module____qualname____doc__r3   r   r   r   r   r   r   r;   rE   rC   rS   rU   rW   rZ   r[   ro   staticmethodrv   boolr   r   r   r   r   r   r   r   r   r   
   sr    



I""&

,@",r   )
loggingtypingr   r   r   r+   	getLoggerr   r6   r   r   r   r   r   <module>   s
    
