o
    pjr%                     @  sV  d dl mZ d dlZd dlZd dlZd dlZd dlmZmZm	Z	m
Z
 d dlZd dlmZ d dlmZ ddlmZmZ ddlmZmZ dd	lmZ dd
lmZ ddlmZmZ d dlmZ eej e! d ej"ej#dd e$dZ%dWddZ&e' ej(dddddXddZ)e)*dej(ddd d!ej(d"e+g d#d$d%ej(d&d'd(ej(d)d*dd+d,ej(d-de,dd.d/ej(d0d1e,dd2d/dYd;d<Z-e)*d=dZd>d?Z.e)* dZd@dAZ/d[dCdDZ0e)* dZdEdFZ1e)*dGej(dHddIdd\dKdLZ2e)*dMej(dNdddOdPd]dRdSZ3dZdTdUZ4e4  e5dVkr)e)  dS dS )^    )annotationsN)DictAnyListTuple)load_dotenv)	urlencode   )AroFloClientAroFloError)AroFloConfigErrorAroFloSettings)build_capabilities_manifest)build_registry)UsersContractErrorquery_users)SecretsManagerz.envz"%(levelname)s:%(name)s:%(message)s)levelformat
aroflo_clireturnr
   c                   C  s   t  S )zN
    Helper central para crear el cliente AroFlo para comandos generales.
    )r
    r   r    apps/aroflo_connector_app/cli.pymake_client    s   r   z--debugTzActiva logs en modo DEBUG.)is_flaghelpdebugboolNonec                 C  s&   | rt  t j td dS dS )z!CLI para la AroFlo Connector App.zModo DEBUG activado.N)logging	getLoggersetLevelDEBUGlogr   )r   r   r   r   cli'   s   r$   zcontract-usersz--tenant-idzTrusted platform tenant ID.)requiredr   z--operation)listsearchgetr'   )typedefaultz--record-id )r*   z--filterfilter_specsz&Canonical field:operator:value filter.)multipler   z--pagei'  )r*   r)   z--page-size   d   	tenant_idstr	operation	record_idtuple[str, ...]pageint	page_sizec              
     s   g }|D ]0}| dd}t|dkrtd|d  dv r' dk||d |d d	 qt  d
}	 fdd|	D }
zttt	
|
d|||||ddd}W n tttfyr } ztt||d}~ww ttj|ddd dS )zCRun the normalized users contract through tenant vault credentials.:      z,Each --filter must use field:operator:value.>   truefalser;   r   r	   )fieldoperatorvalue)aroflo_base_urlaroflo_u_encodedaroflo_p_encodedaroflo_api_secretaroflo_org_encodedaroflo_host_ipc                   s*   i | ]} j d |d dur|qS )aroflo_connector_app)r0   app_idsecret_nameN)
get_secret).0namemanagerr0   r?   r   r   
<dictcomp>F   s
    z"contract_users.<locals>.<dictcomp>)settings)r5   r7   auto)r2   r3   filters
pagination	transportNFindentensure_ascii)splitlenclickClickExceptionlowerappendr   r   r
   r   from_credentialsr   r   r   r1   echojsondumps)r0   r2   r3   r,   r5   r7   rQ   specpartsnamescredentialsresultexcr   rL   r   contract_users0   s,   


rg   zonesc               
   C  sn   zt  } W n ty! } ztd tt| tdd}~ww t| }ttjt	|
 ddd dS )u,   Lista las zonas registradas (debug rápido).   ❌ Error de configuración:r	   Nr9   FrT   )r   r   rY   r^   r1   
SystemExitr   r_   r`   r&   keys)clientrf   regr   r   r   	zones_cmdU   s   

"rn   c               
   C  s   zt  } W n ty" } ztd tt| tdd}~ww td | j| jdd d | j	dd d | j
dd d | jdd d | j| j| jd}ttj|dd	d
 dS )uB   Verifica que las variables de entorno necesarias estén presentes.u   ❌ Configuración incompleta:r	   Nu'   ✅ Configuración OK. Valores leídos:   z...)base_url	u_encoded	p_encoded
api_secretorg_encodedaccepthost_iptimeoutr9   FrT   )r   from_envr   rY   r^   r1   rj   rp   rq   rr   rs   rt   ru   rv   rw   r_   r`   )rO   rf   maskedr   r   r   envcheckf   s&   


rz   Tuple[Dict[str, Any], str]c                  C  s    g d} t | }t| }||fS )zH
    Replica el urlVarString del script de Postman para zone=users.
    ))zoneusers)wherezand|createdutc|>|2001-01-01)r5   1)r   dict)params_list
var_stringparamsr   r   r   build_users_query   s   r   c               
   C  s   zt  } W n ty! } ztd tt| tdd}~ww t \}}z| jdd||d}W n tyN } ztd tt| tdd}~ww td tt	j
|d	d
d dS )z?
    Ping simple a AroFlo usando base_url + ?zone=users...
    ri   r	   Nr+   GETmethodr   r   u!   ❌ Error al conectar con AroFlo:u2   ✅ Conexión OK a zone=users. Respuesta resumida:r9   FrT   )r   r   rY   r^   r1   rj   r   requestr   r_   r`   )rl   rf   r   r   datar   r   r   ping   s0   





r   z	users-rawz--include-rawz&Imprime la respuesta completa en JSON.include_rawc              
   C  s  zt  }W n ty! } ztd tt| tdd}~ww t \}}z|jdd||d}W n tyN } ztd tt| tdd}~ww | r^tt	j
|dd	d
 dS |di }|dpt|dpt|dptg }tdt|  |D ]<}|dp|dp|d}	|dp|dp|dp|dd d|dd  }
td|	 d|
  qdS )uW   
    Lista usuarios desde AroFlo usando zone=users en base_url (versión antigua).
    ri   r	   Nr+   r   r   u   ❌ Error al obtener usuarios:r9   FrT   zoneresponser}   itemsrecordszUsuarios recibidos: useridUserIDidrK   UserNameusername
givennames surnamez- z: )r   r   rY   r^   r1   rj   r   r   r   r_   r`   r(   rX   strip)r   rl   rf   r   r   r   r|   r   uuidrK   r   r   r   	users_raw   sN   




"
 r   z	caps-dumpz--pretty/--no-prettyu>   Imprime el JSON con indentación legible o en una sola línea.)r*   show_defaultr   prettyc              
   C  s   zt  }W n ty! } ztd tt| tdd}~ww t|}| r5ttj|ddd dS ttj|ddd dS )	zH
    Muestra el manifest de capacidades de la AroFlo Connector App.
    ri   r	   Nr9   FrT   ),r8   )
separatorsrV   )	r   r   rY   r^   r1   rj   r   r_   r`   )r   rl   rf   manifestr   r   r   	caps_dump   s   

r   c               
   C  s   zt  } W n ty } ztd| W Y d}~dS d}~ww t| }| D ]?\}}t d| d}zt|}W n t	yI   td| Y q'w t
|dd}t|r`|t| td| q'td| q'dS )	u   
    Registra dinámicamente las CLIs de todas las zonas registradas.

    Estándar:
    - cada zona puede tener zones/<zone>/cli.py con register_cli(root, zone)
    - el CLI general no debe duplicar lógica por zona
    z:No se pudo construir AroFloClient para registrar zonas: %sNz.zones.z.cliz%Zona '%s' no tiene cli.py (saltando).register_clizRegistrada CLI para zona '%s'.z8Zona '%s' tiene cli.py pero sin register_cli (saltando).)r   r   r#   r   r   r   __package__	importlibimport_moduleModuleNotFoundErrorgetattrcallabler$   )rl   rf   registrycoder|   module_pathmodregister_fnr   r   r   register_zone_clis   s,   

r   __main__)r   r
   )r   r   r   r   )r0   r1   r2   r1   r3   r1   r,   r4   r5   r6   r7   r6   r   r   )r   r   )r   r{   )r   r   r   r   )r   r   r   r   )6
__future__r   r   r_   r   ostypingr   r   r   r   rY   dotenvr   urllib.parser   rl   r
   r   configr   r   services.capabilitiesr   zones.registryr   services.users_v1r   r   'bridge_platform.secrets.secrets_managerr   pathjoingetcwdbasicConfigINFOr    r#   r   groupoptionr$   commandChoiceIntRangerg   rn   rz   r   r   r   r   r   __name__r   r   r   r   <module>   sp   


,
"

