o
    Œh�jM  ã                   @   st  d dl mZmZmZmZ d dlmZ d dlmZ d dl	m
Z
mZmZmZmZmZmZ d dlmZmZmZmZ eddgd�Zd	ed
efdd„Zejdee ejd�eeƒfdefdd„ƒZejdeejd�eeƒfdedefdd„ƒZejdeejd�eeƒfde defdd„ƒZ!ej"deejd�eeƒfde dedefdd„ƒZ#ejdeejd�eeƒfde dedefdd„ƒZ$dS )é    )Ú	APIRouterÚstatusÚHTTPExceptionÚDepends)Úget_database)Úrequire_admin)Úcreate_agentÚget_agent_by_emailÚget_agent_by_idÚlist_agentsÚupdate_agentÚcount_active_adminsÚreset_agent_password)ÚCreateAgentRequestÚUpdateAgentRequestÚResetAgentPasswordRequestÚSafeAgentInfoz/api/v1/admin/agentszadmin-agents)ÚprefixÚtagsÚ	agent_docÚreturnc              
   C   sŽ   |   d¡}|   d¡}t| d |   dd¡| d |   dd¡|   d	d
¡t|dƒr)| ¡ n|r/t|ƒndt|dƒr;| ¡ d�S |rCt|ƒd�S dd�S )zBHelper to convert MongoDB agent document into safe Pydantic model.Ú	createdAtÚ	updatedAtÚagentIdÚnameÚAgentÚemailÚroleÚAGENTr   ÚACTIVEÚ	isoformatN)r   r   r   r   r   r   r   )Úgetr   Úhasattrr    Ústr)r   Ú
created_atÚ
updated_at© r&   ú9/web/html/dev/chatbot/backend/app/routers/admin_agents.pyÚformat_safe_agent   s   




 ù
ùùr(   Ú )Úresponse_modelÚstatus_codeÚcurrent_adminc                 Ã   s$   �t ƒ }t|ƒI dH }dd„ |D ƒS )zM
    Lists all agents in MongoDB.
    Requires ADMIN authorization role.
    Nc                 S   s   g | ]}t |ƒ‘qS r&   )r(   )Ú.0Úar&   r&   r'   Ú
<listcomp>,   s    z#list_all_agents.<locals>.<listcomp>)r   r   )r,   ÚdbÚagentsr&   r&   r'   Úlist_all_agents$   s   €r2   Úpayloadc                 Ã   sb   �t ƒ }| j ¡  ¡ }t||ƒI dH }|rttjdd�‚t||| j	| j
| j| jd�I dH }t|ƒS )zŽ
    Creates a new agent with hashed password.
    Rejects duplicate email with HTTP 409 Conflict.
    Requires ADMIN authorization role.
    Nz$Agent with this email already exists©r+   Údetail)r   Úpasswordr   r   r   )r   r   ÚstripÚlowerr	   r   r   ÚHTTP_409_CONFLICTr   r6   r   r   r(   )r3   r,   r0   Únormalized_emailÚexistingr   r&   r&   r'   Úcreate_new_agent.   s$   €
þú	r<   z
/{agentId}r   c                 Ã   s:   �t ƒ }t|| ƒI dH }|sttjd| › d�d�‚t|ƒS )zY
    Returns single agent details by agentId.
    Requires ADMIN authorization role.
    NúAgent 'ú' not foundr4   )r   r
   r   r   ÚHTTP_404_NOT_FOUNDr(   )r   r,   r0   Úagentr&   r&   r'   Úget_agent_detailsM   s   €	
þrA   c                 Ã   sÌ   �t ƒ }t|| ƒI dH }|sttjd| › d�d�‚|jdd�}| d¡dko,| d	¡d
k}d|v o6|d dk}d	|v o@|d	 d
k}|rY|sG|rYt|ƒI dH }	|	dkrYttjdd�‚t	|| |ƒI dH }
t
|
ƒS )z’
    Updates safe fields (name, role, status) for an agent.
    Enforces Last Active Admin protection.
    Requires ADMIN authorization role.
    Nr=   r>   r4   T)Úexclude_unsetr   ÚADMINr   r   é   z9Cannot deactivate or demote the last active admin account)r   r
   r   r   r?   Ú
model_dumpr!   r   r9   r   r(   )r   r3   r,   r0   r@   ÚupdatesÚis_target_active_adminÚdemoting_roleÚdeactivating_statusÚactive_admins_countÚupdated_docr&   r&   r'   Úupdate_agent_details_   s*   €
þþrL   z/{agentId}/reset-passwordc                 Ã   sN   �t ƒ }t|| ƒI dH }|sttjd| › d�d�‚t|| |jƒI dH }t|ƒS )za
    Resets an agent's password to a new bcrypt hash.
    Requires ADMIN authorization role.
    Nr=   r>   r4   )r   r
   r   r   r?   r   ÚnewPasswordr(   )r   r3   r,   r0   r@   rK   r&   r&   r'   Úreset_agent_password_endpoint„   s   €

þrN   N)%Úfastapir   r   r   r   Úapp.databaser   Úapp.dependencies.authr   Ú!app.repositories.agent_repositoryr   r	   r
   r   r   r   r   Úapp.models.authr   r   r   r   ÚrouterÚdictr(   r!   ÚlistÚHTTP_200_OKr2   ÚpostÚHTTP_201_CREATEDr<   r#   rA   ÚpatchrL   rN   r&   r&   r&   r'   Ú<module>   sR    $		þÿþþÿþýÿþý$ýÿþý