
    E|j              
       (   d dl Z d dlZd dl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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j4                  e      Z e       Z G d de      Z G d de      Z G d de      Z  G d de      Z!dede"fdZ#ejI                  de!       ee       ee      fdede"fd       Z%ejI                  d       ee       ee      fde&dede"fd       Z'ejQ                  dejR                         ee       ee      fdedede"fd        Z*ejW                  d       ee       ee      fde&dedede"fd!       Z,ej[                  dej\                         ee       ee      fde&dede"fd"       Z/y)#    N)	APIRouterDependsHTTPExceptionstatus)AsyncSession)select)	BaseModelfield_validator)ListOptional)get_dbget_current_staff)MstrDepartment)error_codes)ADMIN_ROLE_KEYSc                       e Zd ZU eed<   eed<   dZee   ed<    ed      ed               Z	 ed      ed               Z
y)CreateDepartmentRequestnamecodeNdescriptionc                 @    |j                         }|st        d      |S Nz!Department name must not be emptystrip
ValueErrorclsvs     8/var/www/html/ai-nims-dev/backend/app/api/departments.pyname_must_not_be_emptyz.CreateDepartmentRequest.name_must_not_be_empty   #     GGI@AA    c                 @    |j                         }|st        d      |S Nz!Department code must not be emptyr   r   s     r   code_must_not_be_emptyz.CreateDepartmentRequest.code_must_not_be_empty#   r!   r"   )__name__
__module____qualname__str__annotations__r   r   r
   classmethodr    r%    r"   r   r   r      sZ    
I
I!%K#%V   V  r"   r   c                       e Zd ZU dZee   ed<   dZee   ed<   dZee   ed<    e	d      e
d               Z e	d      e
d               Zy)UpdateDepartmentRequestNr   r   r   c                 D    ||j                         }|st        d      |S r   r   r   s     r   r    z.UpdateDepartmentRequest.name_must_not_be_empty1   (     =	A !DEEr"   c                 D    ||j                         }|st        d      |S r$   r   r   s     r   r%   z.UpdateDepartmentRequest.code_must_not_be_empty:   r0   r"   )r&   r'   r(   r   r   r)   r*   r   r   r
   r+   r    r%   r,   r"   r   r.   r.   ,   sl    D(3-D(3-!%K#%V   V  r"   r.   c                   J    e Zd ZU eed<   eed<   eed<   dZee   ed<   eed<   y)DepartmentItemidr   r   Nr   	createdAt)r&   r'   r(   r)   r*   r   r   r,   r"   r   r3   r3   F   s$    G
I
I!%K#%Nr"   r3   c                       e Zd ZU ee   ed<   y)DepartmentListResponsedepartmentsN)r&   r'   r(   r   r3   r*   r,   r"   r   r7   r7   N   s    n%%r"   r7   dreturnc                     t        | j                        | j                  | j                  | j                  | j
                  j                         dS )N)r4   r   r   r   r5   )r)   r4   r   r   r   
created_at	isoformat)r9   s    r   dept_to_dictr>   R   s<    !$$i}}\\++- r"    )response_modeldbcurrent_staffc                 r  K   | j                  t        t              j                  t        j                  dk(        j                  t        j                               d {   }|j                         j                         }t        |D cg c]  }t        di t        |       c}      S 7 Nc c}w w)NT)r8   r,   )executer   r   where	is_activeorder_byr   scalarsallr7   r3   r>   )rA   rB   resultr8   r9   s        r   list_departmentsrK   ^   s     
 ::~$$^%=%=%EFOOP^PcPcd F .."&&(K!Ze.fUV~/PQ/P.fgg	 /gs$   AB7!B0"+B7B2(	B72B7z
/{dept_id}dept_idc                 v  K   |j                  t        t              j                  t        j                  t        j                  |       k(  t        j                  dk(               d {   }|j                         }|s,t        t        j                  t        j                  dd      t        |      S 7 Mw)NTDepartment not founderrormessagestatus_codedetail)rD   r   r   rE   r4   uuidUUIDrF   scalar_one_or_noner   r   HTTP_404_NOT_FOUNDr   DEPARTMENT_NOT_FOUNDr>   rL   rA   rB   rJ   depts        r   get_departmentr\   j   s      ::~$$^%6%6$))G:L%LnNfNfjnNno F $$&D11(==J`a
 	
 s   A'B9)B7*AB9)rS   bodyc           	      J  K   |j                  d      t        vr,t        t        j                  t
        j                  dd      |j                  t        t              j                  t        j                  | j                  k(  t        j                  | j                  k(               d {   }|j                         r,t        t        j                  t
        j                  dd      t        t!        j"                         | j                  | j                  | j$                  ddd      }|j'                  |       |j)                          d {    |j+                  |       d {    t,        j/                  d	|j                         t1        |      S 7 7 J7 3w)
Nrolez"Only admins can create departmentsrO   rR   1Department with this name and code already existsr?   T)r4   r   r   r   llm_system_promptllm_summary_promptrF   zDepartment created: %s)getr   r   r   HTTP_403_FORBIDDENr   	FORBIDDENrD   r   r   rE   r   r   rW   HTTP_409_CONFLICTDEPARTMENT_ALREADY_EXISTSrU   uuid4r   addcommitrefreshloggerinfor>   )r]   rA   rB   existingr[   s        r   create_departmentro   |   sV      711(22?cd
 	

 ZZ~$$499,499,	
 H ""$00(BB  PC  D
 	

 ::<YYYY$$D FF4L
))+
**T

KK($))43, s7   B+F#-F.B&F#FF#-F!.0F#F#!F#c           
      L  K   |j                  d      t        vr,t        t        j                  t
        j                  dd      |j                  t        t              j                  t        j                  t        j                  |       k(               d {   }|j                         }|s,t        t        j                  t
        j                   dd      |j"                  |j"                  n|j"                  }|j$                  |j$                  n|j$                  }|j"                  |j$                  ||j"                  k7  s||j$                  k7  r|j                  t        t              j                  t        j"                  |k(  t        j$                  |k(  t        j                  t        j                  |       k7               d {   }|j                         r,t        t        j&                  t
        j(                  dd      ||_        ||_        |j*                  |j*                  |_        |j-                          d {    |j/                  |       d {    t0        j3                  d|j"                         t5        |      S 7 7 7 M7 6w)Nr_   z"Only admins can update departmentsrO   rR   rN   r`   zDepartment updated: %s)rc   r   r   r   rd   r   re   rD   r   r   rE   r4   rU   rV   rW   rX   rY   r   r   rf   rg   r   rj   rk   rl   rm   r>   )	rL   r]   rA   rB   rJ   r[   new_namenew_codeconflicts	            r   update_departmentrt      s#      711(22?cd
 	

 ::f^4::>;L;LPTPYPYZaPb;bcddF$$&D11(==J`a
 	

 !II1tyytyyH II1tyytyyH		!6X=RV^bfbkbkVk>"((##x/##x/!!TYYw%77
 
 &&("44!,!F!F  TG  H 
 DIDI#++
))+
**T

KK($))4C e
$ sJ   BJ$JD8J$JA>J$J J$+J",0J$J$ J$"J$c                 2  K   |j                  d      t        vr,t        t        j                  t
        j                  dd      |j                  t        t              j                  t        j                  t        j                  |       k(               d {   }|j                         }|s,t        t        j                  t
        j                   dd      d|_        |j%                          d {    t&        j)                  d|        y 7 x7 w)Nr_   z"Only admins can delete departmentsrO   rR   rN   FzDepartment deactivated: %s)rc   r   r   r   rd   r   re   rD   r   r   rE   r4   rU   rV   rW   rX   rY   rF   rj   rl   rm   rZ   s        r   delete_departmentrv      s       711(22?cd
 	

 ::f^4::>;L;LPTPYPYZaPb;bcddF$$&D11(==J`a
 	

 DN
))+
KK,g6 e s%   BDDAD7D8DD)0rU   loggingfastapir   r   r   r   sqlalchemy.ext.asyncior   
sqlalchemyr   pydanticr	   r
   typingr   r   app.core.depsr   r   app.models.mstr_departmentr   app.constantsr   app.constants.role_keysr   	getLoggerr&   rl   routerr   r.   r3   r7   dictr>   rc   rK   r)   r\   postHTTP_201_CREATEDro   putrt   deleteHTTP_204_NO_CONTENTrv   r,   r"   r   <module>r      s     = = /  / ! 3 5 % 3			8	$	
i ,i 4Y &Y &N t  B56v!"34hhh 7h L v!"34  " RV445 v!"34$
!$$ $ 6$N L v!"34	--
!- 	- 	- -` |)C)CD v!"34777 7 E7r"   