o
    :in                     @  s   d dl mZ d dlmZmZ d dlmZmZmZm	Z	m
Z
 d dlmZmZ eG dd dZeG dd dZG d	d
 d
eZdS )    )annotations)	dataclassfield)AnyDictListOptionalLiteral)ABCabstractmethodc                   @  s:   e Zd ZU ded< ded< ded< ded< dZded	< dS )
	ParamSpecstrnametypeboolrequireddescriptionNzOptional[List[str]]enum)__name__
__module____qualname____annotations__r    r   r   B/var/www/html/flask_server/apps/aroflo_connector_app/zones/base.pyr   	   s   
 r   c                   @  s   e Zd ZU dZded< ded< dZded< dZded< eed	Z	d
ed< ee
d	Zded< dZded< dZded< dZded< ee
d	Zded< ee
d	Zded< dZded< dZded< dS ) ZoneOperationu   
    Describe una operación de una zona (por ejemplo: 'get_users', 'create_user').

    Esta clase sirve tanto para:
    - Ejecutar la operación (dispatcher / zonas reales)
    - Describir capacidades para el manifest que leerá el agente IA
    r   codelabel r   GEThttp_method)default_factoryDict[str, Any]default_paramszList[ParamSpec]paramsreadzLiteral['read', 'write']side_effectTr   
idempotentNzOptional[str]categoryz	List[str]	use_caseszList[Dict[str, Any]]exampleslowz Literal['low', 'medium', 'high']
risk_levelFrequires_confirmation)r   r   r   __doc__r   r   r   r   dictr"   listr#   r%   r&   r'   r(   r)   r+   r,   r   r   r   r   r      s   
 r   c                   @  sl   e Zd ZU dZded< ded< ded< dd
dZeedddZdddZ	dddZ
e	d d!ddZdS )"Zoneu   
    Clase base para cualquier 'zona' (Users, Clients, LastUpdate, etc.).
    Cada zona conoce sus operaciones y cómo traducirlas a llamadas AroFlo.
    r   r   r   r   clientr   returnNonec                 C  s
   || _ d S N)r1   )selfr1   r   r   r   __init__N   s   
zZone.__init__List[ZoneOperation]c                 C     dS )z
        Lista de operaciones soportadas por la zona.
        Ejemplo en Users:
        - get_users
        - get_user
        - create_user
        - update_mobile
        Nr   r5   r   r   r   
operationsS      zZone.operationsop_coder   c                 C  s6   | j D ]}|j|kr|  S qtd| d| j d)Nu   Operación 'z' no encontrada en zona '')r:   r   KeyError)r5   r<   opr   r   r   get_operation`   s
   

zZone.get_operationr!   c                 C  s    | j | j| jdd | jD dS )Nc                 S  s&   g | ]}|j |j|j|j|jd qS )r   r   r   r   r"   rA   ).0r?   r   r   r   
<listcomp>k   s    z Zone.to_dict.<locals>.<listcomp>r   r   r   r:   rD   r9   r   r   r   to_dictf   s   zZone.to_dictNoperation_coder#   Optional[Dict[str, Any]]c                 C  r8   )u   
        Ejecuta una operación concreta de la zona.
        'params' viene directamente del body del POST /zone/<zone_code>/query.
        Cada zona se encarga de mapear a la llamada AroFlo concreta.
        Nr   )r5   rF   r#   r   r   r   executex   r;   zZone.execute)r1   r   r2   r3   )r2   r7   )r<   r   r2   r   )r2   r!   r4   )rF   r   r#   rG   r2   r   )r   r   r   r-   r   r6   propertyr   r:   r@   rE   rH   r   r   r   r   r0   A   s   
 


r0   N)
__future__r   dataclassesr   r   typingr   r   r   r   r	   abcr
   r   r   r   r0   r   r   r   r   <module>   s   .