
    E|jI              
          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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 d d	lmZ d d
lmZ d dlmZ  e j6                  e      Z e       ZdZdZ dZ!dZ"dZ# G d de      Z$de
dedejJ                  de&de'f
dZ(ejS                  dd       ee       ee      fde$de
fd       Z*y)    N)datetime	timedeltatimezone)	APIRouterDepends)AsyncSession)select)IntegrityError)	BaseModelfield_validator)get_dbget_current_staff)settings)Patient)PatientDepartmentMap2   d         x   c                       e Zd ZU eed<   eed<   eed<   eed<    ed      ed               Z ed      ed               Z	 ed      ed               Z
 ed      ed               Zy	)
CreatePatientRequestdailyPatientIdnameagegenderc                     |j                         }|st        d      t        |      t        kD  rt        dt         d      |S )NzdailyPatientId cannot be emptyzdailyPatientId max  chars)strip
ValueErrorlenMAX_DAILY_ID_LENGTHclsvs     5/var/www/html/ai-nims-dev/backend/app/api/patients.pystrip_idzCreatePatientRequest.strip_id"   sG     GGI=>>q6''23F2GvNOO    c                     |j                         }|st        d      t        |      t        kD  rt        dt         d      t	        j
                  d|      st        d      |S )Nzname cannot be emptyz	name max r   z^[a-zA-Z\s\-'\.]+$z?name must contain only letters, spaces, hyphens, or apostrophes)r   r    r!   MAX_NAME_LENGTHrematchr#   s     r&   validate_namez"CreatePatientRequest.validate_name,   s_     GGI344q6O#y(9@AAxx-q1^__r(   c                     |j                         }|st        d      t        |      t        kD  rt        dt         d      |S )Nzgender cannot be emptyzgender max r   )r   r    r!   MAX_GENDER_LENGTHr#   s     r&   validate_genderz$CreatePatientRequest.validate_gender8   sF     GGI566q6%%{+<*=VDEEr(   c                 b    t         |cxk  r	t        k  sn t        dt          dt               |S )NzAge must be between z and )MIN_AGEMAX_AGEr    r#   s     r&   	valid_agezCreatePatientRequest.valid_ageB   s/     !&w&3G9E'KLLr(   N)__name__
__module____qualname__str__annotations__intr   classmethodr'   r-   r0   r4    r(   r&   r   r      s    
I	HK%&  ' V   X   U  r(   r   dbpatientdept_idis_newreturnc                    K   | j                  t        t              j                  t        j                  |j
                  k(  t        j                  |k(               d {   }|j                         sQ| j                  t        t        j                         |j
                  |             | j                          d {    t        |j
                        |j                  |j                  |j                  |j                   |dS 7 7 Jw)N)id
patient_iddepartment_id)	patientIddailyIdr   r   r   isNew)executer	   r   whererD   rC   rE   scalar_one_or_noneadduuiduuid4commitr8   daily_idr   r   r   )r=   r>   r?   r@   existing_maps        r&   _attach_department_and_respondrR   J   s      #$** ++wzz9 ..'9	
 L **,
#zz|zz!
 	
 iik_##{{..  	s&   AD D
!A DDA	DD    )status_codebodyc           	      ^  K   t        j                  |d         }t        j                  t        j
                        }|j                  t        t              j                  t        j                  | j                  k(  t        j                  |j                         k(               d {   }|j                         }|r7t        j!                  d|j"                         t%        |||d       d {   S |t'        t(        j*                        z   }t        t        j,                         | j                  | j.                  | j0                  | j2                  |      }|j5                  |       	 |j7                          d {    t        j!                  d|j"                         t%        |||d	       d {   S 7 7 7 @# t8        $ r |j;                          d {  7   |j                  t        t              j                  t        j                  | j                  k(  t        j                  |j                         k(               d {  7  }|j                         }| t        j!                  d|j"                         t%        |||d       d {  7  cY S w xY w7 w)
NdepartmentIdz4Patient already exists today, returning existing: %sF)r@   )hours)rC   rP   r   r   r   
expires_atzCPatient creation raced with another request, returning existing: %szPatient created: %sT)rM   UUIDr   nowr   utcrI   r	   r   rJ   rP   r   intake_datedaterK   loggerinforC   rR   r   r   DATA_RETENTION_HOURSrN   r   r   r   rL   flushr
   rollback)rV   r=   staffr?   r\   existingr>   rZ   s           r&   create_patientrg   g   s     iin-.G
,,x||
$C ZZw 3 33388:-	
 H ))+GJGJJW3BQVWWW yx'D'DEEJ::<$$YYHH{{G FF7OXhhj  KK%wzz2/GWTRRRS X 	 Xkkm7O!!  D$7$77##sxxz1
 
 
 --/?Y[b[e[ef3BQVWWWWX  Ss   B'J-)G *AJ-2G3A=J-1G GG 	2J-;J+<J-J-G J(#G&$A0J(IA
J(J" J(%J-'J((J-)+loggingr+   rM   r   r   r   fastapir   r   sqlalchemy.ext.asyncior   
sqlalchemyr	   sqlalchemy.excr
   pydanticr   r   app.core.depsr   r   app.core.configr   app.models.patientr   !app.models.patient_department_mapr   	getLoggerr5   r`   routerr"   r*   r/   r2   r3   r   r[   booldictrR   postrg   r<   r(   r&   <module>rw      s     	  2 2 & /  ) / 3 $ & B			8	$	  

+9 +\&15DH	: RS! v
#
$2S
2S2S "2Sr(   