o
    m[2i                     @   st   d dl Z d dlmZmZmZ d dlZddlmZmZ ddl	m
Z
mZmZ e eZG dd deZG dd	 d	ZdS )
    N)AnyDictOptional   )AroFloSettingsAroFloConfigError)build_authorization_valuebuild_timestampbuild_hmac_signaturec                   @   s   e Zd ZdZdS )AroFloErroru/   Error genérico al hablar con la API de AroFlo.N)__name__
__module____qualname____doc__ r   r   >/var/www/html/flask_server/apps/aroflo_connector_app/client.pyr      s    r   c                   @   sv   e Zd ZdZ		ddee deej ddfddZ	dddd	d
de	de	dee
e	ef  dede	dedefddZdS )AroFloClientu   
    Cliente para la API de AroFlo.

    - Carga settings desde .env
    - Construye headers HMAC (igual Postman)
    - Hace request genérico y parsea JSON
    Nsettingssessionreturnc                 C   s2   |pt  | _|pt | _| jjddi d S )Nz
User-Agentzaroflo-connector-app/0.0.1)r   from_envr   requestsSessionr   headersupdate)selfr   r   r   r   r   __init__   s   zAroFloClient.__init__GET )paramsjson
var_stringpathmethodr   r    r!   kwargsc             
   K   s  | j jd}|r|d|d 7 }t| j }t }	t||pd||	| j d\}
}|di p/i }i ||}|durBd|vrBd|d< |d| j j}t	
d	||||| z| jj| |f||||d
|}W n tjy} } ztd| |d}~ww t	
d|jt|j z| }W n ty } ztd|j d|j|d}~ww |d}|jdks|dvrtd|j d||S )uV  
        Llamada genérica a AroFlo.

        - path: ruta relativa (ej: '', 'api/v5', etc. según AROFLO_BASE_URL)
        - method: 'GET', 'POST', etc.
        - params: querystring (dict) -> se convertirá a ?a=b&c=d
        - json: body JSON
        - var_string: cadena EXACTA que se usa en el HMAC (zone=...&where=...&page=...)
        /r   )request_typer!   authorizationiso_timestampr   r   NzContent-Typezapplication/jsontimeoutz4AroFlo request %s %s params=%s json=%s var_string=%s)r   r    r   r)   z%Error de red al conectar con AroFlo: z$AroFlo response status=%s headers=%sz'Respuesta no JSON desde AroFlo (status=z): statusi  )N0r   OKz#Error en respuesta de AroFlo. HTTP=z
, payload=)r   base_urlrstriplstripr   r	   r
   popr)   logdebugr   requestupperr   RequestExceptionr   status_codedictr   r    
ValueErrortextget)r   r"   r#   r   r    r!   r$   urlr'   iso_ts_hmac_headersextra_headersr   r)   respexcdatar*   r   r   r   r3   *   s|   

	
	
zAroFloClient.request)NN)r   )r   r   r   r   r   r   r   r   r   strr   r   r3   r   r   r   r   r      s>    

	r   )loggingtypingr   r   r   r   configr   r   authr   r	   r
   	getLoggerr   r1   RuntimeErrorr   r   r   r   r   r   <module>   s    
