o
    ìcj                     @  s   d Z ddlmZ ddlZddlmZ ddlmZmZ ddl	Z	ddl
mZmZmZmZ eeZG dd deZG d	d
 d
ZdS )u/  Cliente HTTP configurable hacia la API externa de CRM / datos.

La base se arma con ``CRM_API_BASE_ID`` (ej. project id de MockAPI) o con
``CRM_API_BASE_URL`` absoluta. Los paths relativos se configuran por recurso
(``CRM_ENDPOINT_CLIENTES``, ``CRM_ENDPOINT_PRODUCTOS``, ``CRM_ENDPOINT_POLIZAS``, …).
    )annotationsN)Any)quoteurljoin)ClienteProductoPolizasResourceResultc                      s(   e Zd Zddddd fddZ  ZS )CrmApiErrorN status_codepathbodymessagestrr   
int | Noner   r   r   returnNonec                  s"   t  | || _|| _|| _d S N)super__init__r   r   r   )selfr   r   r   r   	__class__ 4/var/www/html/bot-asterisk-ari/backend/crm/client.pyr      s   
zCrmApiError.__init__)
r   r   r   r   r   r   r   r   r   r   )__name__
__module____qualname__r   __classcell__r   r   r   r   r
      s
    r
   c                   @  s   e Zd ZdZddddddBddZdCddZdddddDdd Zdd!dEd"d#Zdd!dFd$d%Zdd!dGd'd(Z	dHd+d,Z
dId.d/Zdd!dJd1d2ZdKd5d6ZdLd9d:Zdd!dMd<d=ZdCd>d?ZdNd@dAZdS )OCrmApiClientzNConsulta recursos REST de la API externa (clientes, productos, polizas, etc.).Nr   g      .@T)	endpointsapi_keytimeoutenabledbase_urlr   r"   dict[str, str] | Noner#   r$   floatr%   boolr   r   c                C  s   | dd | _dddd|pi | _|pd | _|| _ddd}| jr-d	| j |d
< tj| j||d| _t	
d| j| j| j d S )N/clientes	productospolizas)r+   r,   r-   r   zapplication/json)AcceptzContent-TypezBearer Authorization)r&   headersr$   z.CRM API client base=%s endpoints=%s enabled=%s)rstripr&   r"   stripr#   r%   httpxAsyncClient_clientloggerinfo)r   r&   r"   r#   r$   r%   r0   r   r   r   r   '   s2   	zCrmApiClient.__init__resourcepartsc                 G  sX   | j |p|}|dg}|D ]}t| d}|r&|t|dd qd|S )u@   Arma path relativo: resource key → endpoint configurado + ids.r*   r   )safe)r"   getr2   r   appendr   join)r   r8   r9   basesegmentspartvaluer   r   r   resolve_pathK   s   
zCrmApiClient.resolve_path)paramsjsonr8   methodr   rC   dict[str, Any] | NonerD   r	   c             
     s  | j std|d}td| || z| jj| |||dI d H }W n tj	yG } ztd|  d| d| |d|d }~ww z|
 }	W n tyZ   |j}	Y nw t|	|j||d	}
|jd
krk|
S |jdkrtd|  d| d|j |j||	d|
S )Nz-CRM API deshabilitada (CRM_API_ENABLED=false)r*   zCRM %s %s params=%s)rC   rD   zError de red CRM  z: )r   )datar   r8   r     i  zCRM u
    → HTTP r   )r%   r
   lstripr6   debugupperr5   requestr3   	HTTPErrorrD   
ValueErrortextr	   r   )r   rE   r   rC   rD   r8   cleanresponseexcr   resultr   r   r   rM   U   sT   	



zCrmApiClient.requestrC   c                  s,   | j |g|R  }| jd|||dI d H S )NGET)rC   r8   )rB   rM   )r   r8   rC   r9   r   r   r   r   r;      s   zCrmApiClient.getc                  s   | j ||dI d H S )NrU   )r;   )r   r8   rC   r   r   r   list   s   zCrmApiClient.listlist[Cliente]c                  R   | j d|dI d H }|jdks|jrg S t|jt r|jn|jg}dd |D S )Nr+   rU   rI   c                 S      g | ]}t |trt|qS r   )
isinstancedictr   from_api.0rowr   r   r   
<listcomp>       z.CrmApiClient.list_clientes.<locals>.<listcomp>rW   r   is_emptyr[   rH   r   rC   rT   rowsr   r   r   list_clientes      zCrmApiClient.list_clientes
cliente_idCliente | Nonec                   :   |  d|I d H }|jdkst|jtsd S t|jS )Nr+   rI   )r;   r   r[   rH   r\   r   r]   )r   ri   rT   r   r   r   get_cliente   
   zCrmApiClient.get_cliente	documentoc              	     s   t | }|sdS | |I dH }|r|S d|id|id|ifD ]3}z| j|dI dH }W n	 ty8   Y q"w |D ]}|j|krH|    S q;t|dkrU|d   S q"dS )zDBusca por id/documento. Primero GET /cliente/{doc}; si falla, lista.Nidrn   searchrU      r   )r   r2   rl   rg   r
   ro   len)r   rn   docfoundrC   matchesclienter   r   r   find_cliente_by_documento   s*   
z&CrmApiClient.find_cliente_by_documentolist[Producto]c                  rY   )Nr,   rU   rI   c                 S  rZ   r   )r[   r\   r   r]   r^   r   r   r   ra      rb   z/CrmApiClient.list_productos.<locals>.<listcomp>rc   re   r   r   r   list_productos   rh   zCrmApiClient.list_productosproducto_idProducto | Nonec                   rk   )Nr,   rI   )r;   r   r[   rH   r\   r   r]   )r   rz   rT   r   r   r   get_producto   rm   zCrmApiClient.get_producto	poliza_idPolizas | Nonec                   rk   )Nr-   rI   )r;   r   r[   rH   r\   r   r]   )r   r}   rT   r   r   r   
get_poliza   rm   zCrmApiClient.get_polizalist[Polizas]c                  rY   )Nr-   rU   rI   c                 S  rZ   r   )r[   r\   r   r]   r^   r   r   r   ra      s     z-CrmApiClient.list_polizas.<locals>.<listcomp>rc   re   r   r   r   list_polizas   s   zCrmApiClient.list_polizasc                 G  s   t | j| j|g|R  S r   )r   r&   rB   )r   r8   r9   r   r   r   absolute_url   s   zCrmApiClient.absolute_urlc                   s   | j  I d H  d S r   )r5   aclose)r   r   r   r   close   s   zCrmApiClient.close)r&   r   r"   r'   r#   r   r$   r(   r%   r)   r   r   )r8   r   r9   r   r   r   )rE   r   r   r   rC   rF   rD   rF   r8   r   r   r	   )r8   r   r9   r   rC   rF   r   r	   )r8   r   rC   rF   r   r	   )rC   rF   r   rX   )ri   r   r   rj   )rn   r   r   rj   )rC   rF   r   rx   )rz   r   r   r{   )r}   r   r   r~   )rC   rF   r   r   )r   r   )r   r   r   __doc__r   rB   rM   r;   rW   rg   rl   rw   ry   r|   r   r   r   r   r   r   r   r   r!   $   s8    
$6




	r!   )r   
__future__r   loggingtypingr   urllib.parser   r   r3   
crm.modelsr   r   r   r	   	getLoggerr   r6   RuntimeErrorr
   r!   r   r   r   r   <module>   s    
