
    2Yh                     ~   d dl mZ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 d dl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Z d dlmZ dededefdZ	 	 	 	 ddede de de!de"deee   ee"ef   f   fdZ#dededee   fdZ$dede"dee   fdZ%dede"dee   fdZ&dedededefdZ'dededdfdZ(y)     )ListOptionalDictAnyTypeUnion)UUID)selectupdate)IntegrityErrorSQLAlchemyError)Session)User)
UserCreate
UserUpdateUserResponse)APIException)STATUS_DELETED)get_password_hash)QueryPaginatordb	user_datareturnc           	      T  K   	 t        |j                  |j                  |j                  |j                  t        |j                              }| j                  |       | j                          | j                  |       t        j                  |      S # t        $ r`}dt        |      i}dt        |      j                         v rddi}ndt        |      j                         v rddi}t        d|dd	
      d}~wt         $ r}t        ddt        |      idd
      d}~ww xY ww)z
    Create a new user
    )emailusername
first_name	last_namepassworddetailr   Email already registeredr   Username already takenusers  zFailed to create usermoduleerrorstatus_codemessageN  Unexpected error occurred)r   r   r   r   r   r   r   addcommitrefreshr   model_validater   strlowerr   	Exception)r   r   usereerror_details        ^/var/www/html/wine-match-dev/backend/winematch-backend/src/apps/users/services/user_service.pycreate_userr7      s    "
//'' ++))&y'9'9:
 	t
		


4**400 
(0#a&'9c!flln$#%?@L3q6<<>)&(@AL+	
 	
  
SV$/	
 	

s6   D(BB D(	D%AC::D%D  D%%D(skiplimitpaginaterequest_urlc                 6  K   	 t        t              j                  t        j                  t        k7        j                  |      j                  |      }| j                  |      }|j                         j                         }|rt        t              j                  t        j                  t        k7        }| j                  |      }	t        |	j                         j                               }
|
||z  dz   |||z   |
k  r| d||z  dz    d| nd|dkD  r| d||z   d| nd| d| | d|
|z  |
|z  rdndz    d| |D cg c]  }t        j                  |       c}dS |S c c}w # t        $ r}t        d	d
t        |      idd      d}~ww xY ww)z7
    Get all active users with optional pagination
       z?page=   z
&per_page=Nr   z?page=1&per_page=)totalpageper_pagenextpreviousfirstlastresultr#   r    r*   r+   r%   )r
   r   wherestatusr   offsetr9   executescalarsalllenr   r/   r2   r   r0   )r   r8   r9   r:   r;   queryrF   r#   count_querycount_resultr?   r3   r4   s                r6   	get_usersrQ   9   s     
t""4;;.#@AHHNTTUZ[E" $$& ,,,T[[N-JKK::k2L,,.2245E )!VZ]bVbejVj;-vdema.?-@
5'RptVZ]^V^{m6$%-
5'Rdh'=(9%A&-veunUU]XY.Z-[[efkelmINO<66t<O	 	 L P
  
SV$/	
 	

sG   FEE. E)"E. &F'E. (F)E. .	F7FFFuser_idc                 J  K   	 t        t              j                  t        j                  |k(  t        j                  t
        k7        }| j                  |      }|j                         j                         S # t        $ r}t        ddt        |      idd      d}~ww xY ww)z
    Get user by ID
    r#   r    r*   r+   r%   N)r
   r   rG   idrH   r   rJ   rK   rD   r2   r   r0   )r   rR   rN   rF   r4   s        r6   get_user_by_idrU   f   s     

t""477g#5t{{n7TUE"~~%%'' 
SV$/	
 	

s)   B#A3A8 7B#8	B BB  B#r   c                   K   	 t        t              j                  t        j                  |k(        }| j	                  |      }|j                         j                         S # t        $ r}t        ddt        |      idd      d}~ww xY ww)z
    Get user by email
    r#   r    r*   r+   r%   N)
r
   r   rG   r   rJ   rK   rD   r2   r   r0   )r   r   rN   rF   r4   s        r6   get_user_by_emailrW   w   s}     

t""4::#67E"~~%%'' 
SV$/	
 	

)   BAA" !B"	B
+BB

Br   c                   K   	 t        t              j                  t        j                  |k(        }| j	                  |      }|j                         j                         S # t        $ r}t        ddt        |      idd      d}~ww xY ww)z
    Get user by username
    r#   r    r*   r+   r%   N)
r
   r   rG   r   rJ   rK   rD   r2   r   r0   )r   r   rN   rF   r4   s        r6   get_user_by_usernamerZ      s}     

t""4==H#<=E"~~%%'' 
SV$/	
 	

rX   r3   c                   K   	 |j                  d      }|j                         D ]  \  }}|	t        |||        | j                          | j	                  |       |S # t
        $ r`}dt        |      i}dt        |      j                         v rddi}ndt        |      j                         v rddi}t        d	|d
d      d}~wt        $ r}t        d	dt        |      idd      d}~ww xY ww)z
    Update user data
    T)exclude_unsetNr    r   r!   r   r"   r#   r$   zFailed to update userr%   r*   r+   )

model_dumpitemssetattrr-   r.   r   r0   r1   r   r2   )r   r3   r   user_data_dictkeyvaluer4   r5   s           r6   update_userrc      s    
"--D-A(..0 	*JC c5)	* 			


4 
(0#a&'9c!flln$#%?@L3q6<<>)&(@AL+	
 	
  
SV$/	
 	

s:   C3*A! 1A!  C3!	C0*ACC0C++C00C3Nc                    K   	 t         |_        | j                          y# t        $ r}t	        ddt        |      idd      d}~ww xY ww)z%
    Delete a user (soft delete)
    r#   r    r*   r+   r%   N)r   rH   r-   r2   r   r0   )r   r3   r4   s      r6   delete_userre      sL     	
$
		 
SV$/	
 	

s$   A  A	AAAA)r   d   Fz/api/v1/users))typingr   r   r   r   r   r   uuidr	   
sqlalchemyr
   r   sqlalchemy.excr   r   sqlalchemy.ormr    src.apps.users.models.user_modelr   #src.apps.users.schemas.user_schemasr   r   r   src.core.exceptionsr   src.utils.constantsr   src.utils.guardr   src.utils.paginationr   r7   intboolr0   rQ   rU   rW   rZ   rc   re        r6   <module>rv      s?   9 9  % : " 1 T T , . - /&
' &
j &
\ &
V &*
*

*
 *
 	*

 *
 4:tCH~%&*
Z
W 
t 
 
"
 
 
 
"
7 
c 
htn 
"!
' !
 !
* !
 !
H
' 
 
$ 
ru   