o
    2i
                     @  sj   d dl mZ d dlmZmZ d dlmZmZmZm	Z	 d dl
mZmZ eG dd dZG dd deZd	S )
    )annotations)	dataclassfield)AnyDictListOptional)ABCabstractmethodc                   @  sL   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< dS )ZoneOperationuX   
    Describe una operación de una zona (por ejemplo: 'get_users', 'create_user').
    strcodelabel descriptionGEThttp_method)default_factoryDict[str, Any]default_paramsN)
__name__
__module____qualname____doc____annotations__r   r   r   dictr    r   r   B/var/www/html/flask_server/apps/aroflo_connector_app/zones/base.pyr   	   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)r   )selfr   r   r   r   __init__#   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   r#   r   r   r   
operations(      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)r#   r*   opr   r   r   get_operation5   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   r/   ).0r-   r   r   r   
<listcomp>@   s    z Zone.to_dict.<locals>.<listcomp>r   r   r   r(   r2   r'   r   r   r   to_dict;   s   zZone.to_dictNoperation_codeparamsOptional[Dict[str, Any]]c                 C  r&   )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   )r#   r4   r5   r   r   r   executeM   r)   zZone.execute)r   r   r    r!   )r    r%   )r*   r   r    r   )r    r   r"   )r4   r   r5   r6   r    r   )r   r   r   r   r   r$   propertyr
   r(   r.   r3   r7   r   r   r   r   r      s   
 


r   N)
__future__r   dataclassesr   r   typingr   r   r   r   abcr	   r
   r   r   r   r   r   r   <module>   s   