
    E|j              	       H   U d dl Z d dlZd dlZd dlmZmZmZ d dl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mZ d dlmZmZm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  d dl!m"Z" d dl#m$Z$ d dl%m&Z& d dl'm(Z( d dl)m*Z*  e jV                  e,      Z-dZ.ee/d<   dZ0ee/d<    e	       Z1 G d de      Z2 G d de      Z3e1ji                  de3       ejj                  d       e
e      fdede2defd              Z6e1ji                  d        e
e       e
e      fded!e7fd"       Z8y)#    N)datetime	timedeltatimezone)Final)	APIRouterDependsHTTPExceptionRequeststatus)AsyncSession)selectfunc)	BaseModelEmailStrfield_validator)get_dbget_current_staff)
verify_pincreate_access_token)limiter)User)MstrRole)ActiveSession)PatientLock)settings)error_codes   
PIN_LENGTH   MAX_FAILED_ATTEMPTSc                   H    e Zd ZU eed<   eed<    ed      ed               Zy)LoginRequestemailpinc                 h    t        j                  dt         d|      st        dt         d      |S )Nz^\d{z}$zPIN must be exactly z numeric digits)rematchr   
ValueError)clsvs     1/var/www/html/ai-nims-dev/backend/app/api/auth.pypin_must_be_6_digitsz!LoginRequest.pin_must_be_6_digits$   s5     xx5C0!43J<OPP    N)	__name__
__module____qualname__r   __annotations__strr   classmethodr,    r-   r+   r"   r"       s+    O	HU  r-   r"   c                   "    e Zd ZU eed<   eed<   y)LoginResponseaccessTokenstaffN)r.   r/   r0   r2   r1   dictr4   r-   r+   r6   r6   ,   s    Kr-   r6   z/login)response_modelz	10/minuterequestbodydbc                 
  K   |j                  t        t              j                  t        j                  |j                  k(               d {   }|j                         }|s,t        t        j                  t        j                  dd      |j                  s,t        t        j                  t        j                  dd      |j                  @t        t        j                  t        j                  dt!        |j                        d      t#        |j$                  |j&                        s|xj(                  dz  c_        |j(                  t*        k\  rt-        j.                  t0        j2                        |_        |j5                          d {    t6        j9                  dt*        |j                         t        t        j                  t        j                  d	t*         d
d      |j5                          d {    t        t        j                  t        j                  dd      |j                  t        t;        j<                               j?                  t@              j                  t@        jB                  t-        j.                  t0        j2                        kD               d {   }|jE                         }|tF        jH                  k\  r,t        t        jJ                  t        jL                  dd      d|_        |jO                          d {    t-        j.                  t0        j2                        tQ        tF        jR                        z   }|j                  t        t@              j                  t@        jT                  |jV                  k(               d {   }|j                         }	|	r||	_!        n:|jY                  tA        t[        j\                         |jV                  d |             |j5                          d {    |j                  t        t^              j                  t^        jV                  |j`                  k(               d {   }
|
jc                         }te        t!        |jV                        |jf                  t!        |jh                              }t6        jk                  d|j                         tm        |t!        |jV                        |jn                  |jf                  |j                  dt!        |jh                        id      S 7 7 7 >7 7 "7 7 .7 w)NzInvalid Email or PIN)errormessage)status_codedetailzAccount is deactivatedzAccount locked. Contact admin.)r?   r@   lockedAt   z+Account locked after %d failed attempts: %szAccount locked after z  failed attempts. Contact admin.z5Maximum concurrent sessions reached. Try again later.r   )minutes)idstaff_id
session_id
expires_at)rG   roledepartment_idzLogin successful: %srF   )rF   namerJ   r#   
department)r7   r8   )8executer   r   wherer#   scalar_one_or_noner	   r   HTTP_401_UNAUTHORIZEDr   INVALID_CREDENTIALS	is_activeHTTP_403_FORBIDDENACCOUNT_INACTIVE	locked_atACCOUNT_LOCKEDr2   r   r$   pin_hashfailed_pin_attemptsr    r   nowr   utccommitloggerwarningr   countselect_fromr   rI   scalarr   MAX_CONCURRENT_SESSIONSHTTP_503_SERVICE_UNAVAILABLEMAX_SESSIONS_REACHEDflushr   SESSION_LOCK_TTL_MINUTESrG   rF   adduuiduuid4r   role_id
scalar_oner   role_keyrK   infor6   rL   )r;   r<   r=   resultusercount_resultactive_countrI   existing_slotslotrole_resultrJ   tokens                r+   loginrv   3   s'     ::fTl00tzz1IJKKF$$&D44(<<I_`
 	
 >>11(99F^_
 	
 ~~!11(77Ddruvz  wE  wE  sF  G
 	
 dhh.  A% ##'::%\\(,,7DN))+NNHJ]_c_i_ij"55!,!;!;J_`s_t  uU  IV  W  iik44(<<I_`
 	
 tzz|((7==$$x||HLL'AA	
 L
  &&(Lx777;;(==  KB  C
 	
  !D
((* hll+i@a@a.bbJ**}##M$:$:dgg$EF M ++-D$
}zz|WW!	
 	 ))+ 

6(#3#9#9(++:U#VWWK!!#D  TWW]]$,,-E KK&

3dgg,IIMMZZT%7%7!89
	 	q L8  	   Xs   AUUE
UUA0U
UB3U>U?A-U,U-BU:U;A+U&U'AU6U7CUUUUUUUUz/logoutcurrent_staffc                   K   t        j                  |d         }| j                  t        t              j                  t        j                  |k(               d {   }|j                         j                         D ]  }| j                  |       d {     | j                  t        t              j                  t        j                  |k(               d {   }|j                         j                         D ]  }| j                  |       d {     | j                          d {    t        j                  d|       ddiS 7 7 7 v7 >7 &w)Nsubz
Logout: %ssuccessT)rh   UUIDrN   r   r   rO   rG   scalarsalldeleter   r\   r]   rm   )r=   rw   rG   rs   rowlocklock_rows          r+   logoutr      s)    
 yyu-.H }##M$:$:h$FG D ||~!!# iin {!!+"6"6("BC D LLN&&( "ii!!!" ))+
KKh't 	 	"s[   AEE9EEAEE9EEE2E3EEEEE)9loggingr&   rh   r   r   r   typingr   fastapir   r   r	   r
   r   sqlalchemy.ext.asyncior   
sqlalchemyr   r   pydanticr   r   r   app.core.depsr   r   app.core.authr   r   app.core.limiterr   app.models.userr   app.models.mstr_roler   app.models.active_sessionr   app.models.patient_lockr   app.core.configr   app.constantsr   	getLoggerr.   r]   r   r1   r    routerr"   r6   postlimitrv   r9   r   r4   r-   r+   <module>r      s$    	  2 2  F F / # 9 9 3 9 $   ) 3 / $ %			8	$
E  U 	
	9 	I  Xm4{ vgg
g 	g  5gT Yv!"34 r-   