
    {2iN                        U d dl m Z mZ d dlZd dlmZmZ d dlmZmZ d dl	m
Z
 d dlmZmZmZ d dlmZ d dlmZ d dlmc mc mZ d d	lmZmZ d d
lmZ d dlmZ 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* d dl+m,Z, d dl-m.Z. d dl/m0Z0 dZ1e2ed   df   e3d<    G d d      Z4dedejj                  fdZ6dedejn                  fdZ8 edddddd d!d d "	      Z9dedejt                  d#efd$Z;y)%    )datetime	timedeltaN)LiteralOptional)BackgroundTasksHTTPException)OAuth2PasswordRequestForm)ConnectionConfigFastMailMessageSchema)Session)SimulationResponse)
JWTManagerJWTPayloadSchema)Messages)TblInstitution)TblSimulation)UserBaseTblUser)RESET_OTP_EXPIRE_MINUTESadmin_account_created
send_emailsend_email_asyncsend_otp_email)CustomResponse)TblUserSimulation)service)email)studentadmin
superadmin.VALID_ROLESc                       e Zd ZdedefdZdej                  fdZe	de
defd       Zd Zd	efd
Zd ZdefdZddededeej&                     fdZdej*                  fdZd Zd	efdZd Zy)UserServicedbtokenc                      || _         || _        y N)r%   r&   )selfr%   r&   s      ;/var/www/html/retail-simulation-api/app/api/user/service.py__init__zUserService.__init__   s    
    requestc                    K   t        j                  |      }t        j                  || j                         | j                  j                          t        dt        j                        S w)N1statusmessage)	r   model_validater   creater%   commitr   r   
USER_CREAT)r)   r-   created_users      r*   create_userzUserService.create_user   sI     ..w7|TWW-S(2E2EFFs   A+A-credentialsc                   K   d| j                   i}t        j                  ||      }|st        dt        j
                        | j                  |j                  k7  rt        dt        j                        |j                  j                         }|t        vrt        dd|       t        |j                  d|t        j                               }t        j                   |      }|d	|j"                  ||j                  d
S w)Nemail_id  status_codedetaili    zInvalid role: r    )user_id	user_type	user_roleexpbearer)access_token
token_typer;   rolerA   )usernamer   get_by_user_filterr   r   USER_NOT_FOUNDpasswordINCORRECT_PASSWORDrH   stripr"   r   rA   r   utcnowr   create_access_tokenr;   )r9   r%   user_filteruser_logrH   payloadrF   s          r*   
user_loginzUserService.user_login"   s     !;#7#78--k2>C8O8OPP8#4#44C8S8STT}}""${"C.8OPP"$$!	
 "55g>(" ))&&
 	
s   DDc                   K   | j                   j                  t        dt        j                        t        j                  | j                   j                  | j                        }|st        dt        j                        S |S w)Nr@   r=   -1r0   )
r&   rA   r   r   USER_ID_MISSINGr   
get_usr_idr%   r   rK   r)   users     r*   get_demo_userzUserService.get_demo_user<   sd     ::%C8P8PQQ!!$**"4"4dgg>!x7N7NOOs   BBrA   c                    K   | j                   j                  t              j                  t        j                  |k(        j                         }|S wr(   )r%   queryr   filterrA   first)r)   rA   get_datas      r*   	get_adminzUserService.get_adminE   s:     77==)00G1KLRRTs   AAc                   K   | j                   j                  t        dt        j                        t        d| j                   j                          | j                  j                  t              j                  t        j                  | j                   j                  k(        j                         }|st        dt        j                        S | j                  j                          t        dt        j                        S w)Nr@   r=   zUser ID during logout: rV   r0   r/   )r&   rA   r   r   rW   printr%   r]   r   r^   r_   r   rK   r5   USER_LOGOUTrY   s     r*   logoutzUserService.logoutI   s     ::%C8P8PQQ'

(:(:';<=ww}}W%,,W__

@R@R-RSYY[!x7N7NOOS(2F2FGGs   DD	r1   c                 V  K   | j                   j                  t        j                        j	                  t        j
                  | j                  j
                  k(        j                         }|t        dt        j                        |d   }t        j                  | j                   | j                        }|dk(  r|dv r]| j                   j                  t              j	                  t        j                  j                  ddg            j!                         }n| j                   j                  t              j	                  t        j                  |k(        j!                         }nh|dk(  r`|dv r| j                   j                  t              j#                  t$        t$        j&                  t        j&                  k(        j	                  t$        j
                  | j                  j
                  k(  t        j                  j                  ddg            j!                         }n| j                   j                  t              j#                  t$        t$        j&                  t        j&                  k(        j	                  t$        j
                  | j                  j
                  k(  t        j                  |k(        j!                         }ng }g }|D ]  }|j)                  |j&                         d {   }|j+                  |j,                         d {   }	|j/                  |j&                  |j0                  |j2                  |j                  |j4                  |j6                  |j8                  |j:                  |j,                  |	xs g d	
        ||d
S 7 7 w)Nr@   r=   r   r!   )ActivePendingrg   rh   r    )
simulationIdsimulationNamedescriptionr1   	startDateendDateinstitutionlocationsimulationCodegroups)rH   simulations)r%   r]   r   rH   r^   rA   r&   r_   r   r   rW   r   SimulationServicer   r1   in_alljoinr   simulation_idget_simulationget_groups_by_simulation_idsimulation_codeappendsimulation_namerk   
start_dateend_datern   ro   )
r)   r1   r`   rH   simulation_servicerr   resultsimsim_obj
sim_groupss
             r*   
simulationzUserService.simulationU   s    GGMM',,'VGOOtzz'9'99:UW 	
 C8P8PQQ{$66tww

K<..GGMM-0VM0044h	5JKLSU  GGMM-0VM00F:;SU  W_..GGMM-0T))77=;V;VV V)11TZZ5G5GG%,,00(I1FG SU  GGMM-0T))77=;V;VV V)11TZZ5G5GG%,,6 SU  KC.==c>O>OPPG1MMcNaNabbJMM ' 5 5")"9"9&22!..$//"++&22#,,")"9"9$* 	 $ !
 	
! Qbs%   K:N)<N%="N)N' BN)'N)Nadmin_idrw   c                 N  K   |dk(  r|st        dd      S t        j                         }t        j                  |      }||_        | j                  j                  t              j                  t        j                  |j                  k(        j                         }|rt        dd      t        j                  || j                        }| j                  j                          | j                  j                  |       |j                  }t!        ddddd	d
ddd	      }t#        |      }	d}
d}d|j$                   d|j                   d| d|
 d	}t'        ||j                  g|d      }|	j)                  |       d {    t+        dt,        j.                        S 7 w)Nr   r@   z)Admin data is required when admin_id is 0r=   z$Admin exists with another simulationinfo@compunet.solutions	Jn193518fsmtp.stackmail.comiK  FT	MAIL_USERNAMEMAIL_PASSWORD	MAIL_FROMMAIL_SERVER	MAIL_PORTMAIL_SSL_TLSMAIL_STARTTLSUSE_CREDENTIALSVALIDATE_CERTSz%https://trilliant.compunet.in/retail/zYour New Account Detailsz
            Hello zN,

            Your account has been created successfully.
            Email: z
            Password: zB
            
            Login using the link below:
            zN

            Please log in and change your password immediately.
            plainsubject
recipientsbodysubtyper/   r0   )r   r   generate_random_passwordr   r3   rL   r%   r]   r   r^   r;   r_   r4   r5   refreshrA   r
   r   
first_namer   send_messager   r   r6   )r)   r   rw   r-   rL   r7   existing_usernew_userconffm	login_urlr   r   r2   s                 r*   
admin_linkzUserService.admin_link  s    q=$=hii557H#227;L$,L! g&((G,<,<<=  # #A 
 ~~lDGG<HGGNNGGOOH%''H#7)30"" $#
D* $B?I0G&&' ( %%& 'j ! K D $$--.	G //'***S(2E2EFF +s   FF%F# F%c                   K   | j                   j                  }|st        dt        j                        S t
        j                  j                  |      }t        j                  || j                        }|st        dt        j                        S |j                  |j                  k7  rt        dt        j                        S |j                  |j                   k7  rt        dt        j"                        S |j                  |_        | j                  j%                          t        dt        j&                        S w)NrV   r0   r/   )r&   rA   r   r   rW   schemasUserPassUpdater3   r   rX   r%   rK   current_passwordrL   CURRENT_PASSORD_INCORRECTnew_passwordconfirm_password%NEWPASSWORD_CONFIRMPASSWORD_NOT_MATCHr5   PASSWORD_UPDATED)r)   r-   rA   updated_userrZ   s        r*   update_passzUserService.update_passZ  s     **$$!x7O7OPP--<<WE!!'4773!x7N7NOO((DMM9!x7Y7YZZ$$(E(EE!x7e7eff$11S(2K2KLLs   D>E c           
      (  K   | j                   j                  t              j                         }g }|D ]  }| j                   j                  t              j                  t        j                  |j                  k(        j                         }|D cg c]&  }|j                  |j                  |j                  d( }}|j                  |j                  |j                  |j                  |j                  |j                  |d        |S c c}w w)Ninstitution_idinstitutions_namemembers_count)rA   r   	last_namer;   mobile_numberinstitutions)r%   r]   r   ru   r   r^   r   rA   r   r   r   r{   r   r   r;   r   )r)   usersr   rZ   r   instinstitutions_responses          r*   get_all_adminzUserService.get_all_adminj  s     g&**,Dn-//4<<?@  )% )D	 '+&9&9)-)?)?%)%7%7
 ) " % MM<<"oo!^^ MM!%!3!3 5  . #%s   BD+D=ADc                   K   | j                   j                  t              j                  t        j                  |k(        j                         }|st        dd      | j                   j                  t              j                  t        j                  |j                  k(        j                         }| j                   j                  t              j                  t        j                  |j                  k(        j                         }|D cg c]  }|j                   }}| j                   j                  t              j                  t        j                  j                  |            j                         }t        d |D              }|D 	cg c]&  }	|	j                  |	j                   |	j"                  d( }
}	|D cg c]s  }|j                  |j$                  |j&                  |j(                  |j*                  |j,                  |j.                  |j0                  |j2                  |j4                  d
u }}|j                  |j6                  |j8                  |j:                  |j<                  ||
|dgS c c}w c c}	w c c}w w)Nr<   User not foundr=   c              3   4   K   | ]  }|j                     y wr(   )members).0r   s     r*   	<genexpr>z4UserService.get_admin_institution.<locals>.<genexpr>  s     ?;CCKK;s   r   )
rw   r|   rk   r1   r}   r~   rn   ro   rz   r   )rA   r   r   r;   r   r   r   rr   )r%   r]   r   r^   rA   r_   r   r   r   ru   r   rw   r   rt   sumr   r   r   r|   rk   r1   r}   r~   rn   ro   rz   r   r   r   r;   r   )r)   rA   r   r   simulation_rowsrowsimulation_idsrr   total_membersr   r   r   simulations_responses                r*   get_admin_institutionz!UserService.get_admin_institution  s$    GGMM'"VGOOw./UW 	
 C8HIIGGMM.)VN++u}}<=SU 	 GGMM+,V%-->?SU 	 8GG#++GGGMM-(VM//33NCDSU 	
 ?;?? %!
 %	 #'"5"5%)%;%;!%!3!3
 % 	 !
* # 
 # "%!2!2#&#6#6"**!nnLL"LL#&#6#6;; # 	  
  }}**"00*1/	
 	 		= H!
 
s-   DJI>$A1J+J JA8J>AJc                 D  K   | j                   j                  t              j                  t        j                  | j
                  j                  k(        j                         }|st        dt        j                        t        j                  j                  |      S w)Nr<   r=   )r%   r]   r   r^   rA   r&   r_   r   r   rK   r   UserDetailResponser3   )r)   get_user_datas     r*   get_user_detailszUserService.get_user_details  sl     g.55gooI[I[6[\bbdCx7N7NOO))88GGs   BB r(   )__name__
__module____qualname__r   r   r+   r   
UserCreater8   staticmethodr	   rT   r[   intra   re   strr   r   UserCreateLinkr   r   r   r   r   r    r,   r*   r$   r$      s    7 *: G);); G 
&? 
W 
 
2c HN
s N
vGG GGC GG(SZSiSiJj GGTM)?)? M ::3 :xHr,   r$   r%   r-   c                    | j                  t              j                  t        j                  |j                  k(        j	                         }|st        dt        j                        |j                  |j                  k7  s-|j                  !|j                  t        j                         k  rt        dt        j                        d|_	        | j                  |       | j                          t        dt        j                         S )'Verifies OTP and allows password reset.r<   r=   Nr@   r/   r0   )r]   r   r^   r;   r_   r   r   rK   otp
otp_expiryr   rO   INVALID_OTPaddr5   r   OTP_IS_CORRECTr%   r-   rZ   s      r*   reset_password_servicer     s    xx ''(8(8G<L<L(LMSSUC8O8OPPHH#t'>$//T\TcTcTeBeC8L8LMM
t
		S(2I2IJJr,   c                 p   t         j                  |j                  k(  r| j                  t               j	                  t         j
                  |j
                  k(        j                         }|j                  |_        | j                  |       | j                          n| j                  t               j	                  t         j
                  |j
                  k(        j                         }|j                  |_        | j                  |       | j                          t        dt        j                        S )r   r/   r0   )r   rL   old_passwordr]   r^   r;   r_   r   r   r5   r   r   r   r   s      r*   new_password_servicer     s    w33388G$++G,<,<@P@P,PQWWYD#00DMFF4LIIK88G$++G,<,<@P@P,PQWWYD#00DMFF4LIIKS(2K2KLLr,   r   r   r   i  TFr   background_tasksc                 j  K   | j                  t              j                  t        j                  |j                  k(        j	                         }|st        dd      t        t        j                  dd            }||_	        t        j                         t        d      z   |_        | j                  |       | j                          d}d	|j                    d
| d}t#        ||j                  g|d      }t%        t&              }|j)                  |j*                  |       t-        dd      S w)Nr<   r   r=   i i?B 
   )minutesz&Password Reset OTP - Retail Simulationz
    Hello zF,

    We received a request to reset your password.
    Your OTP is: zt

    This OTP is valid for 10 minutes.

    If you did not request a password reset, please ignore this email.
    r   r   r/   zOTP sent successfullyr0   )r]   r   r^   r;   r_   r   r   randomrandintr   r   rO   r   r   r   r5   r   r   r   r   add_taskr   r   )	r%   r-   r   rZ   r   r   r   r2   r   s	            r*   forgot_password_servicer      s    
 88G##G$4$48H8H$HIOOQD4DEE fnnVV,
-CDHoo')B*??DOFF4LIIK6G??
   		D MM?	G 
$Bboow7.EFFs   D1D3)<r   r   r   typingr   r   fastapir   r   fastapi.securityr	   fastapi_mailr
   r   r   sqlalchemy.ormr   app.api.simulation.schemasr   app.api.user.schemasapirZ   r   app.dependency.authanticationr   r   app.locale.messagesr   app.models.main.institutionr   app.models.main.simulationr   app.models.main.userr   r   app.utils.emailr   r   r   r   r   app.utils.schemas_utilsr   app.models.main.user_simulationr   app.api.simulationr   	app.utilsr   r"   tuple__annotations__r$   VerifyOTPRequestr   NewPassr   r   ForgotPasswordRequestr   r   r,   r*   <module>r      s    ( (  $ 2 6 B B " 9 & & F ( 6 4 2 y y 2 = & EgU7;<cAB gpH pHfKg K0H0H KMG Mgoo M4 +'$'G'G**'G &'Gr,   