o
    Ji%                  	   @   s  d Z ddlmZ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 ddlmZ ddlmZ ddlmZmZ dd	lmZ dd
lmZmZ defddZedeefdede
e dedefddZdededefddZeeeefdedededefddZdS )z8
API dependencies
Common dependencies for API endpoints
    )DependsHTTPExceptionstatusHeaderRequest)Session)Optional)get_dbget_db_without_tenant)User)Tenant)decode_access_tokenis_token_revoked)get_translator)ServiceStatusManagerget_status_managerreturnc                   C   s   t  S )zDFastAPI dependency: return the shared ServiceStatusManager instance.)r    r   r   4/lsinfo/ai/hellotax_ai/base_platform/app/api/deps.pyget_service_status_manager   s   r   Nrequestauthorizationdbc                    s  t | }|sttj|ddz| \}}| dkr(ttj|ddW n ty:   ttj|ddw t|}|sKttj|ddt	|rYttj|dd|
d}|sjttj|d	dd
dlm} d
dlm}	 d
dlm}
 |t|tj|	jtjt|k }|sttj|dd|
d}|dur|j|krttj|dd|jsttj|dd|jsttj|dd|S )z7
    Get current authenticated user from JWT token
    zauth.not_authenticatedstatus_codedetailbearerzauth.invalid_auth_schemezauth.invalid_auth_headerzauth.invalid_or_expired_tokenzauth.token_revokedsubzauth.invalid_token_payloadr   
joinedloadUserRoleRolezauth.user_not_found	tenant_idNzauth.tenant_mismatchzauth.email_not_verifiedzauth.account_disabled)r   r   r   HTTP_401_UNAUTHORIZEDtsplitlower
ValueErrorr   r   getsqlalchemy.ormr   app.models.user_roler!   app.models.roler#   queryr   options
user_rolesrolefilteridintfirstr$   HTTP_403_FORBIDDENis_verified	is_active)r   r   r   r&   schemetokenpayloaduser_idr   r!   r#   userjwt_tenant_idr   r   r   get_current_user   s   



r?   r:   c                 C   s   t | }|sttjddt| rttjdd|d}|s&ttjddddlm} ddlm	} dd	l
m} |t|tj|jtjt|k }|sZttjd
d|jr`|jsgttjdd|S )zH
    Get current user from JWT token (for WebSocket authentication)
    zInvalid or expired tokenr   zToken revokedr   zInvalid token payloadr   r   r    r"   zUser not foundzAccount not active)r   r   r   r%   r   r*   r+   r   r,   r!   r-   r#   r.   r   r/   r0   r1   r2   r3   r4   r5   r7   r8   r6   )r:   r   r;   r<   r   r!   r#   r=   r   r   r   get_current_user_from_tokenr   sH   

r@   current_userc                    s\   t | }|jsttj|dd|ttj	|jk
 }|s,ttj|dd|S )z#
    Get current user's tenant
    zauth.no_tenantr   zauth.tenant_not_found)r   r$   r   r   HTTP_400_BAD_REQUESTr&   r.   r   r2   r3   r5   HTTP_404_NOT_FOUND)r   rA   r   r&   tenantr   r   r   get_current_tenant   s   rE   )__doc__fastapir   r   r   r   r   r+   r   typingr   app.db.sessionr	   r
   app.models.userr   app.models.tenantr   app.core.securityr   r   app.core.i18nr   'app.services.llm.service_status_managerr   r   r   strr?   r@   rE   r   r   r   r   <module>   sD    
]1