o
    i%                     @   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		d6dededee defdd	Zd
eeef fddZ			d7d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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	"	#	$d8d%ed&ed'ed(ed)ed
eee
f fd*d+Zed,e
d
efd-d.Zd/eee
f d0ed
efd1d2Zd3ed
eee
f fd4d5ZdS )9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   0/var/www/html/pca-backend/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"|| zFtj| |||| j	d}|j
rOz| }W n tyG   d|ji}Y nw 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
   rawTz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loggererrorstatus_codestr)
r   r   r   r   r   r    r!   responseparsedexcr   r   r   _request   s\   
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_leadsgetr   r	   )r   resultr   r   r   test_connection[   s"   
	z"LeadSquaredService.test_connectionsearch_paramsc                 C      | j dd|pi dS )NPOSTLeadManagement.svc/Leads.Getr   r   r   r4   )r   r@   r   r   r   r<   r   
   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   r4   r0   r   rG   r   r   r   get_leady   s
   
zLeadSquaredService.get_lead	lead_datac                 C   rA   )NrB   zLeadManagement.svc/Lead.CreaterD   rE   )r   rM   r   r   r   create_lead   rF   zLeadSquaredService.create_leadc                 C   s   | j dddt|i|pi dS )NrB   zLeadManagement.svc/Lead.UpdateleadIdr   r   r   r   rJ   )r   rG   rM   r   r   r   update_lead   s   
zLeadSquaredService.update_leadc                 C   s   | j dddt|ii dS )NrB   zLeadManagement.svc/Lead.DeleterO   rP   rJ   rK   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Operatorr7   AdvancedSearchr5   rB   rC   rD   rE   )r   rU   rV   rW   rX   rY   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>)joinr0   )rf   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).
        r:   N)PhoneMobilePhoneNumberTF)lenr=   rl   )r   rm   rn   corefield
stored_rawstoredstored_corer   r   r   _lead_matches_phone   s   

z&LeadSquaredService._lead_matches_phonephonec                 C   s|  |  |}|sddd dS t|dkr|dd  n|}tt||g}g }|D ]"}|ddd|d	gid
dddddd|d	gid
dddg7 }q(|d|dd
dddd|dd
dddg7 }|D ]R}| |}|dsrqe|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 qqeddd dS )NFzPhone is requiredr   r:   ro   ra   rp   Equalr[   r      r7   rc   rq   )SearchByr^   )	Parameterr5   r   r   ListDatalistTz
Lead foundz#No LeadSquared lead found for phone)	rl   rs   r   dictfromkeysr<   r=   
isinstancery   )r   rz   
normalizedrt   search_valuespayloadsvalr   r>   r   rowsrm   r   r   r   search_lead_by_phone   sV   





z'LeadSquaredService.search_lead_by_phone)Nr   )NN)r   rS   rT   )__name__
__module____qualname____doc__r0   r   r   r   r   r   r   r4   r?   r<   rL   rN   rQ   rR   re   staticmethodrl   boolry   r   r   r   r   r   r   
   sj    



<""&

,r   )
loggingtypingr   r   r   r'   	getLoggerr   r-   r   r   r   r   r   <module>   s
    
