
    ]i                        d Z ddl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Z ddlmZ dd	lmZmZmZ dd
lmZmZ ddedefdZd de	dededefdZde	dededefdZde	dedefdZde	dedededef
dZde	dededefdZde	dededdfdZde	dededededefdZ de	dedededdf
dZ!de	dede"e   fdZ#y)!uN   User service — business logic for user management and SPBU role assignments.    N)select)IntegrityErrorSQLAlchemyError)AsyncSession)hash_password)UserSpbuAssignment)User)role_repositoryspbu_repositoryuser_repository)
UserCreate
UserUpdatelengthreturnc                     t         j                  t         j                  z   dj                  fdt	        |       D              S )N c              3   H   K   | ]  }t        j                          y w)N)secretschoice).0_alphabets     ;/var/www/html/spbu.com/backend/app/services/user_service.py	<genexpr>z#_random_password.<locals>.<genexpr>   s     C]7>>(+]s   ")stringascii_lettersdigitsjoinrange)r   r   s    @r   _random_passwordr       s0    ##fmm3H77CU6]CCC    dbactorskiplimitc                   K   |j                   rt        j                  | ||       d{   S | j                  t	        t
        j                        j                  t
        j                  |j                  k(               d{   }|j                         D cg c]  }|d   	 }}|sg dfS t        j                  | |||       d{   S 7 7 Lc c}w 7 w)zZSuperadmin sees all users. SPBU Admin sees only users in their own SPBUs (no superadmins).Nr   )is_superadminr   get_allexecuter   r   spbu_idwhereuser_ididallget_all_scoped)r"   r#   r$   r%   resultrowactor_spbu_idss          r   
list_usersr3      s     $,,Ru===::!))*001C1K1Kuxx1WX F )/

5c!fN51u //ND%PPP > 6 Qs@   'CCACCCC&#C	C
CCCdatac           	        K   |j                   st        d      t        j                  | |j                         d{   }|rt        d      |j                  r5t        j                  | |j                         d{   }|rt        d      |j                  r|j                  n	t               }	 t        j                  | |j                  |j                  |j                  xs dt        |      |j                          d{   }| j                          d{    |S 7 7 7 "7 # t        $ r% | j                          d{  7   t        d      t         $ r | j                          d{  7    w xY ww)uQ   Create a new user. Password is optional — a random one is generated if omitted.z2Hanya Super Admin yang dapat membuat akun penggunaNzEmail sudah terdaftarzUsername sudah digunakan)nameemailusernamepassword_hashr'   Data konflik atau sudah ada)r'   PermissionErrorr   get_by_emailr7   
ValueErrorr8   get_by_usernamepasswordr    creater6   r   commitr   rollbackr   )r"   r4   r#   existingexisting_usernamer?   r0   s          r   create_userrE   #   sB    RSS$11"djjAAH011}}"1"A"A"dmm"TT788 $t}}3C3EH&--**]]*d'1,,
 
 iik% B U

 	 8kkm677 kkmsw   ;F D%A F >D'?3F 3AD- D)D- D+D- $F 'F )D- +D- -E=	E
+E=5E86E==F r,   c                 h   K   t        j                  | |       d{   }|st        d      |S 7 w)z4Fetch a user by ID, raising ValueError if not found.NzUser tidak ditemukan)r   	get_by_idr=   )r"   r,   users      r   get_userrI   B   s4      **2w77D/00K 8s   202c                   K   |j                   st        d      t        | |       d{   }|j                  d      }d|v rt	        |j                  d            |d<   	 t        j                  | |fi | d{   }| j                          d{    |S 7 q7  7 
# t        $ r% | j                          d{  7   t        d      t        $ r | j                          d{  7    w xY ww)zHUpdate scalar fields on a user. Only superadmins can edit user profiles.z3Hanya Super Admin yang dapat mengubah akun penggunaNT)exclude_noner?   r9   r:   )r'   r;   rI   
model_dumpr   popr   updaterA   r   rB   r=   r   )r"   r,   r4   r#   rH   update_datar0   s          r   update_userrP   J   s     STT"g&&D//t/4K[ '4[__Z5P'QO$	&--b$F+FFiik '
 G 8kkm677 kkmsc   'C4B7C4"B! <B=B! BB! C4B! B! !C1=C >+C1)C,*C11C4c                   K   |j                   st        d      t        | |       d{   }|j                  |j                  k(  rt	        d      |j                   r|j                   st        d      	 t        j                  | |d       d{   }| j                          d{    |S 7 7  7 
# t        $ r | j                          d{  7    w xY ww)zQDeactivate a user account. Non-superadmins cannot deactivate superadmin accounts.z8Hanya Super Admin yang dapat menonaktifkan akun penggunaNz%Tidak bisa menonaktifkan akun sendiriz)Tidak bisa menonaktifkan akun Super AdminF)	is_active)
r'   r;   rI   r-   r=   r   rN   rA   r   rB   )r"   r,   r#   rH   r0   s        r   deactivate_userrS   ^   s     XYY"g&&Dww%((@AA%"5"5IJJ&--b$%HHiik ' I kkmsX   'CB0AC6B6 B2B6 )B4*B6 /C2B6 4B6 6CCCCc                   K   |j                   st        d      t        | |       d{   }|j                  |j                  k(  rt	        d      	 t        j                  | |d       d{    | j                          d{    y7 b7 7 	# t        $ r% | j                          d{  7   t	        d      t        $ r | j                          d{  7    w xY ww)zDelete a user. Hard delete in dev mode, soft delete in production.
    Only superadmins can delete users. Cannot delete yourself.z4Hanya Super Admin yang dapat menghapus akun penggunaNz!Tidak bisa menghapus akun sendiriF)hardz2Tidak dapat menghapus user: masih ada data terkait)r'   r;   rI   r-   r=   r   delete_userrA   r   rB   r   )r"   r,   r#   rH   s       r   rV   rV   p   s      TUU"g&&Dww%((<==))"d???iik ' 	@ OkkmMNN kkmsc   'C%B(C%B .B/B BB C%B B C".B1/+C"CC""C%r*   role_idc                 "  K   t        | |       d{    t        j                  | |       d{   }|st        d      |j                  s2|j
                  D ch c]  }|j                   }}||vrt        d      t        j                  | |       d{   }|st        d      t        j                  | ||       d{   }		 |	r!t        j                  | |	|       d{   }
n t        j                  | |||       d{   }
| j                          d{    |
S 7 7 c c}w 7 7 n7 M7 .7 # t        $ r% | j                          d{  7   t        d      t         $ r | j                          d{  7    w xY ww)zAssign a user to an SPBU with a given role. Updates the role if an assignment already exists.
    Non-superadmins can only assign to SPBUs they themselves belong to.NzSPBU tidak ditemukanTidak punya akses ke SPBU inizRole tidak ditemukan)rW   r:   )rI   r   rG   r=   r'   assignmentsr*   r;   r
   r   get_assignmentupdate_assignmentcreate_assignmentrA   r   rB   r   )r"   r,   r*   rW   r#   spbuar2   rolerC   r0   s              r   assign_to_spbura      so    
 2w
 **2w77D/00-2->->?->!))->?.(!"ABB **2w77D/00$33BIIH*<<RSZ[[F*<<R'SZ[[Fiik%  7 @ 8 J \[ 8kkm677 kkms   FD(FD++FD-/*FD2+FD4FD< (D6) D< 	D8
D< !D:"D< 'F+F-F4F6D< 8D< :D< <FE+FFFFc                   K   |j                   s6|j                  xs g D ch c]  }|j                   }}||vrt        d      	 t	        j
                  | ||       d {   }|st        d      | j                          d {    y c c}w 7 /7 # t        $ r  t        $ r% | j                          d {  7   t        d      t        $ r | j                          d {  7    w xY ww)NrY   zAssignment tidak ditemukanz8Tidak dapat menghapus assignment: masih ada data terkait)r'   rZ   r*   r;   r   delete_assignmentr=   rA   r   rB   r   )r"   r,   r*   r#   r_   r2   deleteds          r   remove_assignmentre      s      .3.?.?.E2.EG.E!)).EG.(!"ABB'99"gwOO9::iik H P 	  UkkmSTT kkmsc   C0BC0B  B!$B BB 
C0B B %C-9B<:+C-%C(&C--C0c                 v   K   t        | |       d{    t        j                  | |       d{   S 7 "7 w)z-Return all SPBU assignments for a given user.N)rI   r   get_assignments)r"   r,   s     r   rg   rg      s7      2w
 00W===  =s   959799)   )r   2   )$__doc__r   r   
sqlalchemyr   sqlalchemy.excr   r   sqlalchemy.ext.asyncior   app.core.securityr   app.models.roler   app.models.userr	   app.repositoriesr
   r   r   app.schemas.userr   r   intstrr    r3   rE   rI   rP   rS   rV   ra   re   listrg    r!   r   <module>rw      s   T    : / + .   N N 3DS D# D

Q 
Qd 
Q# 
Q# 
Q, j  $ >| c d ,  J t X\ (l S  $ $,  T d &"-0;>GK@"-09=	,>>">	
>r!   