o
    @h                     @   s   U d dl m Z mZ d dl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  m  mZ d dlmZ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Zeed df ed< G dd dZ dS )    )datetime	timedeltaN)Literal)BackgroundTasksHTTPException)OAuth2PasswordRequestForm)Session)
JWTManagerJWTPayloadSchema)Messages)UserBaseTblUser)RESET_OTP_EXPIRE_MINUTESsend_otp_email)CustomResponse)studentadmin
superadmin.VALID_ROLESc                   @   s   e Zd ZdedefddZdejfddZe	de
defd	d
Zdd Zdd ZdejfddZdejdefddZdejfddZdS )UserServicedbtokenc                 C   s   || _ || _d S )N)r   r   )selfr   r    r   H/var/www/html/RetailApiNew/retail-simulation-api/app/api/user/service.py__init__   s   
zUserService.__init__requestc                    s2   t |}t|| j | j  tdtjdS )N1statusmessage)	r   model_validater   creater   commitr   r   
USER_CREAT)r   r   created_userr   r   r   create_user   s
   

zUserService.create_usercredentialsc                    s   d| j i}t||}|stdtjd| j|jkr"tdtjd|j	 }|t
vr4tdd| dt|jd|t d}t|}|d	|j||jd
S )Nemail_id  status_codedetaili    zInvalid role: r   )user_id	user_type	user_roleexpbearer)access_token
token_typer(   roler.   )usernamer   get_by_user_filterr   r   USER_NOT_FOUNDpasswordINCORRECT_PASSWORDr5   stripr   r
   r.   r   utcnowr	   create_access_tokenr(   )r'   r   user_filteruser_logr5   payloadr3   r   r   r   
user_login   s.   


zUserService.user_loginc                    sD   | j jd u rtdtjdt| j j| j}|s tdtj	dS |S )Nr-   r*   -1r   )
r   r.   r   r   USER_ID_MISSINGr   
get_usr_idr   r   r8   r   userr   r   r   get_demo_user5   s   zUserService.get_demo_userc                    sf   | j jd u rtdtjd| jttj| j jk	 }|s't
dtjdS | j  t
dtjdS )Nr-   r*   rB   r   r   )r   r.   r   r   rC   r   queryr   filterfirstr   r8   r#   USER_LOGOUTrE   r   r   r   logout=   s    
zUserService.logoutc                    s   | j j}|stdtjdS tj|}t	|| j
}|s$tdtjdS |j|jkr1tdtjdS |j|jkr>tdtjdS |j|_| j
  tdtjdS )NrB   r   r   )r   r.   r   r   rC   schemasUserPassUpdater!   r   rD   r   r8   current_passwordr9   CURRENT_PASSORD_INCORRECTnew_passwordconfirm_password%NEWPASSWORD_CONFIRMPASSWORD_NOT_MATCHr#   PASSWORD_UPDATED)r   r   r.   updated_userrF   r   r   r   update_passF   s   
zUserService.update_passbackground_tasksc                    s   | j ttj|jk }|stdtjdt	t
dd}||_t ttd |_| j | | j   |t|j| tdtjdS )z(Generates an OTP and sends it via email.r)   r*   i i?B )minutesr   r   )r   rH   r   rI   r(   rJ   r   r   r8   strrandomrandintotpr   r<   r   r   
otp_expiryaddr#   add_taskr   r   OTP_SEND)r   r   rW   rF   r\   r   r   r   forgot_password_serviceW   s   
z#UserService.forgot_password_servicec                 C   s   | j ttj|jk }|stdtjd|j	|j	ks*|j
du s*|j
t k r1tdtjd|j|_d|_
| j | | j   tdtjdS )z'Verifies OTP and allows password reset.r)   r*   Nr-   r   r   )r   rH   r   rI   r(   rJ   r   r   r8   r\   r]   r   r<   INVALID_OTPrQ   r9   r^   r#   r   rT   )r   r   rF   r   r   r   reset_password_serviced   s   $
z"UserService.reset_password_serviceN)__name__
__module____qualname__r   r
   r   rM   
UserCreater&   staticmethodr   rA   rG   rL   rN   rV   ForgotPasswordRequestr   ra   VerifyOTPRequestrc   r   r   r   r   r      s    	r   )!r   r   rZ   typingr   fastapir   r   fastapi.securityr   sqlalchemy.ormr   app.api.user.schemasapirF   rM   app.dependency.authanticationr	   r
   app.locale.messagesr   app.models.main.userr   r   app.utils.emailr   r   app.utils.schemas_utilsr   r   tuple__annotations__r   r   r   r   r   <module>   s    