o
    dbi"                     @  s   d dl mZ d dlmZmZmZmZmZ ddlm	Z	m
Z
 ddlmZmZmZmZmZ dZdd
dZd ddZd!ddZd"ddZd#ddZdS )$    )annotations)AnyDictListOptionalTuple   )ZoneOperation	ParamSpec   )requestraw_wrapcoerce_page_sizecoerce_orderbuild_list_paramsget_user_by_emailreturnList[ZoneOperation]c                   C  s   t tdddddd dd dd dd	d	d
tddddtddd	dtddd	dtddd	dtddd	dtddd	dtddd	dtddd	dgddd gd!d	d"gS )#NzGet User by Emailu   Busca un usuario por email/email2 haciendo paginación por la API (zone=users) y filtrando en Python. Útil cuando AroFlo ignora where con |=| o no soporta |like|.GETreadTand|createdutc|>|2001-01-01r   2   F)emailwhereorderpagepageSize	max_pages
return_allrawr   stringz1Correo a buscar (match exacto, case-insensitive).r   z7WHERE base para paginar (no se usa para filtrar email).r   z(ORDER estilo AroFlo. Ej: createdutc|descr   integeru   Página inicial (default 1).r   u%   Tamaño de página (AroFlo pageSize).r   u1   Límite de páginas a recorrer para evitar loops.r   booleanz9Si true, devuelve todos los matches (no solo el primero).r   u3   Si true, incluye meta debug + páginas consultadas.usersz1Buscar usuario por email cuando WHERE no funcionazResolver userid desde emaillow)codelabeldescriptionhttp_methodside_effect
idempotentdefault_paramsparamscategory	use_cases
risk_levelrequires_confirmation)r	   OP_CODEr
    r2   r2   Q/var/www/html/flask_server/apps/aroflo_connector_app/zones/users/join_by_email.pyget_operations   s>   
r4   operation_codestrboolc                 C  s   | t kS )N)r1   )r5   r2   r2   r3   supports4   s   r8   vr   c                 C  s   t | pd  S )N )r6   striplower)r9   r2   r2   r3   _norm_email8   s   r=   respList[Dict[str, Any]]c                 C  s   t | tsg S d}t | dtr| d }nt | dtr.t | d dtr.| d d }|s2g S |d}t |trCdd |D S g S )u   
    Intenta extraer la lista de users de respuestas típicas de AroFlo.
    Soporta:
      - resp["zoneresponse"]["users"]
      - resp["data"]["zoneresponse"]["users"] (si alguien ya wrappeó)
    Nzoneresponsedatar#   c                 S  s   g | ]	}t |tr|qS r2   )
isinstancedict).0ur2   r2   r3   
<listcomp>Q   s    z"_extract_users.<locals>.<listcomp>)rB   rC   getlist)r>   zrr#   r2   r2   r3   _extract_users<   s   

$

rJ   clientr,   Dict[str, Any]c              	   C  s  | t krtd|  t|dd}t|d}|s tdt|dp'd}t|}t|}t|dd	}|d	k rAtd
t|dd}	|	d	k rQtdt|dd}
g }g }t	|	D ]a}|| }|
| td|d |||d}t|d|}t|}|s n?|D ];}t|d}t|d}|r||ks||kr|
| |
s|d	||d}|rt|dt fd|fgn|    S qqa|r|d nd t||
r|nd ||d}|rt|dt fd|fgS |S )Nu/   [Users.join_by_email] Operación no soportada: r   Fr   zemail es requerido.r   r   r   r   zpage debe ser >= 1.r   r   zmax_pages debe ser >= 1.r   r#   )zoner   joinr   r   r   r   email2)matchmatchesr   pages_visitedopr   )rP   rQ   all_matchesr   rR   )r1   
ValueErrorr7   rG   r=   r6   r   r   intrangeappendr   r   rJ   r   len)r5   rK   r,   r   r   r   r   	page_sizer   r   r   rR   rQ   icurrent_pageparams_listr>   r#   rE   e1e2resultr2   r2   r3   executeU   sl   
	
&
ra   N)r   r   )r5   r6   r   r7   )r9   r   r   r6   )r>   r   r   r?   )r5   r6   rK   r   r,   rL   r   r   )
__future__r   typingr   r   r   r   r   baser	   r
   _join_utilsr   r   r   r   r   r1   r4   r8   r=   rJ   ra   r2   r2   r2   r3   <module>   s   

(

