
    r;i.                        d dl m Z  d dlmZmZ d dlmZ d dlmZmZm	Z	m
Z
 d dlmZmZ d dlmZ d dlmZmZmZmZmZmZmZmZmZmZmZmZmZmZ d dlm Z m!Z!m"Z" d d	l#m$Z$m%Z%m&Z&m'Z'  ed
dg          Z( ed          Z)dBde*de*defdZ+de*dee*ef         fdZ,dee*ef         dee*ef         ddfdZ-dee*ef         defdZ.e(/                    d          defd            Z0e(/                    d          defd             Z1e(/                    d!e"          defd#            Z2e(/                    d$          defd%            Z3e(/                    d&          defd'            Z4 ee)          fd(efd)Z5e(6                    d*e"           ee5          fd+            Z7e(8                    d,e"           ee5          fd-efd.            Z9e(/                    d/           ee5          fdefd0            Z:e(6                    d1           e
d2d34           ee5          fde*fd5            Z;e(/                    d6           ee5          fde*d-efd7            Z<e(8                    d8           ee5          fde*d9e*d-efd:            Z=e(>                    d;           ee5          fde*d9e*fd<            Z?e(/                    d=           ee5          fde*d-efd>            Z@e(>                    d?           ee5          fde*d-efd@            ZAe(6                    d=ee*ef         "           ee5          fde*fdA            ZBdS )C    )datetime)AnyDict)ObjectId)	APIRouterDependsHTTPExceptionPath)HTTPAuthorizationCredentials
HTTPBearer)get_col)EmailOtpVerifyForgotPasswordRequestForgotPasswordVerifyLoginRequestLoginResponseResetPasswordRequestUserAddAddress
UserCreateUserOutUserUpdateAddressaddToWishlistRequestremoveFromWishlistRequestuserUpdateProfileVoucherRequest)create_email_otpsend_otp_via_emailverify_email_otp)
create_jwthash_password
verify_jwtverify_passwordz/usersusers)prefixtagsF)
auto_erroruser idvaluelabelreturnc                 p    	 t          |           S # t          $ r}t          dd|           |d }~ww xY w)N  zInvalid status_codedetail)r   	Exceptionr	   )r(   r)   excs      0D:\Nbitz\nbitez_python\app\routers\UserRouter.py_ensure_object_idr3       sU    Q Q Q Q4Fu4F4FGGGSPQs    
505user_idc                     t          d          }|                    dt          |           i          }|st          dd          |S )Nr#   _id  User not foundr-   )r   find_oner3   r	   )r4   r#   users      r2   _get_user_or_404r;   '   sP    GE>>5"3G"<"<=>>D F4DEEEEK    target_user	requesterNc                     t          | d                   t          |d                   k    rd S |                    d          dk    rd S t          dd          )Nr6   roleadmini  z"Not authorized to modify this userr-   )strgetr	   )r=   r>   s     r2   _assert_self_or_adminrD   /   s\    
;u#i&6"7"777}}V''
C0T
U
U
UUr<   docc                 x   t          t          | d                   | d         | d         |                     dd          | d         t          |                     dd                    |                     d	t	          j                              |                     d
t	          j                                        S )Nr6   nameemailr@   r:   mobile
isVerifiedF	createdAt	updatedAt)idrG   rH   r@   rI   rJ   rK   rL   )r   rB   rC   boolr   utcnow)rE   s    r2   _user_to_outrP   7   s    s5z??['lWWVV$$8}e4455''+x'8'899''+x'8'899	 	 	 	r<   z	/registerbodyc                    t          d          }|                    d| j                                        i          }|rt	          dd          t          j                    }| j        | j                                        t          | j	                  d| j
        dg g ||d
}|                    |          }t          | j        d	          }t          | j        |d	           d
t          |j                  dS )Nr#   rH   r,   zEmail already registeredr-   r:   F)
rG   rH   passwordr@   rI   rJ   wishlist	addressesrK   rL   verify_emailz<Registered successfully. OTP sent to email for verification.)messageuserId)r   r9   rH   lowerr	   r   rO   rG   r    rS   rI   
insert_oner   r   rB   inserted_id)rQ   r#   existingnowrE   resotps          r2   registerr`   D   s    GE~~w
(8(8(:(:;<<H P4NOOOO
/

C	!!##!$-00+ C 

3

C
4:~
6
6Ctz3777Uadehetauauvvvr<   z/verify-emailc                 F   t          d          }t          | j        d| j                  }|st	          dd          |                    d| j                                        iddt          j                    d	i          }|j	        d
k    rt	          dd          ddiS )Nr#   rV   r,   Invalid or expired OTPr-   rH   $setT)rJ   rL   r   r7   r8   rW   zEmail verified successfully)
r   r   rH   r_   r	   
update_onerY   r   rO   matched_countrQ   r#   okr^   s       r2   rV   rV   ]   s    GE	$*ndh	?	?B N4LMMMM


GTZ%5%5%7%786RVemetevevCwCw:x
y
yC
A4DEEEE455r<   z/login)response_modelc                    t          d          }|                    d| j                                        i          }|st	          dd          t          | j        |d                   st	          dd          t          t          |d                   |d         |	                    dd	          d
          }t          |t          |                    S )Nr#   rH   r,   zInvalid credentialsr-   rS   r6   r@   r:   )subrH   r@   )access_tokenr:   )r   r9   rH   rY   r	   r"   rS   r   rB   rC   r   rP   )rQ   r#   rE   tokens       r2   loginrm   i   s    GE
..'4:#3#3#5#56
7
7C K4IJJJJ4=#j/:: K4IJJJJs3u:WswwW]_eOfOfgghhEe,s2C2CDDDDr<   z/forgot-passwordc                     t          d          }|                    d| j                                        i          }|sddiS t	          | j        d          }t          | j        |d           ddiS )Nr#   rH   rW   z)If the email exists, an OTP has been sentreset_password)r   r9   rH   rY   r   r   )rQ   r#   rE   r_   s       r2   forgot_passwordrp   u   s{    GE
..'4:#3#3#5#56
7
7C HFGG
4:'7
8
8Ctz3(8999BCCr<   z/forgot-password/verifyc                 j   t          d          }t          | j        d| j                  }|st	          dd          |                    d| j                                        idt          | j                  t          j
                    di          }|j        d	k    rt	          d
d          ddiS )Nr#   ro   r,   rb   r-   rH   rc   rS   rL   r   r7   r8   rW   Password updated successfully)r   r   rH   r_   r	   rd   rY   r    newPasswordr   rO   re   rf   s       r2   forgot_password_verifyru      s    GE	$*&6	A	AB N4LMMMM


	$*""$$%	mD,<==HOL]L]^^_ C A4DEEEE677r<   credentialsc                 p   | st          dd          | j        }t          |          \  }}|r|st          dd          t          d          }	 t	          |d                   }n$# t
          $ r}t          dd          |d }~ww xY w|                    d|i          }|st          dd	          |S )
Ni  zNot authenticatedr-   zInvalid tokenr#   rj   zInvalid token subjectr6   r8   )r	   rv   r!   r   r   r0   r9   )rv   rl   rg   payloadr#   oidr1   r:   s           r2   get_current_userrz      s     I4GHHHH#EU##KB EW EODDDDGEVwu~&& V V V4KLLLRUUV>>5#,''D F4DEEEEKs   A( (
B	2BB	z/mec                      t          |           S N)rP   )r:   s    r2   mer}      s    r<   z/me/update-profiledatac                    t          d          }d |                                                                 D             }|st          dd          d |                                D             }t	          j                    |d<   |                    d|d         id	|i           |                    d|d         i          }t          |          S )
Nr#   c                     i | ]
\  }}|||S r|    .0kvs      r2   
<dictcomp>z"update_profile.<locals>.<dictcomp>       IIIDAq1=1a===r<   r,   No fields to updater-   c                     i | ]\  }}||	S r   r   r   s      r2   r   z"update_profile.<locals>.<dictcomp>   s    77741a!Q777r<   rL   r6   rc   )	r   dictitemsr	   r   rO   rd   r9   rP   )r~   r:   r#   update_data
set_fieldsupdated_users         r2   update_profiler      s    GEIIDIIKK$5$5$7$7IIIK K4IJJJJ77;#4#4#6#6777J&o//J{		U	   >>5$u+"677L%%%r<   z/reset-passwordc                    t          d          }t          | j        |d                   st          dd          |                    d|d         idt          | j                  t          j                    di           d	d
iS )Nr#   rS   r,   zCurrent password is incorrectr-   r6   rc   rr   rW   rs   )	r   r"   currentPasswordr	   rd   r    rt   r   rO   )rQ   r:   r#   s      r2   ro   ro      s    GE4/j1ABB U4STTTT		U	mD,<==HOL]L]^^_   677r<   z/{user_id}/addresses.zTarget user identifier)descriptionc                 p    t          |           }t          ||           d|                    dg           iS )NrU   r;   rD   rC   r4   current_userr=   s      r2   get_addressesr      s:    
 #7++K+|444b99::r<   z/add/{user_id}/addressesc                    t          |           }t          ||           t          d          }|                                }t	          t                                |d<   |                    d          r"|                    d|d         idddii           |                    d|d         id|idt          j	                    id	           d
|dS )Nr#   r6   	isDefaultrc   addresses.$[].isDefaultFrU   rL   z$pushrc   zAddress added successfully)rW   address)
r;   rD   r   r   rB   r   rC   rd   r   rO   )r4   r~   r   r=   r#   r   s         r2   add_addressr      s     #7++K+|444GEiikkG__GEN{{; 
K&'/78	
 	
 	

 
	E"#!7+ (/"3"34	
 	
   4HHHr<   z!/{user_id}/addresses/{address_id}
address_idc                 <   t          |           }t          ||           t          d          }d |                                                                D             }|st          dd          |                    d          r"|                    d|d         idd	d
ii           d |                                D             }t          j	                    |d<   |                    |d         |dd|i          }|j
        dk    rt          dd          ddiS )Nr#   c                     i | ]
\  }}|||S r|   r   r   s      r2   r   z"update_address.<locals>.<dictcomp>   r   r<   r,   r   r-   r   r6   rc   r   Fc                      i | ]\  }}d | |S )zaddresses.$.r   r   s      r2   r   z"update_address.<locals>.<dictcomp>   s'    HHHDAq$$$aHHHr<   rL   )r6   zaddresses._idr   r7   Address not foundrW   zAddress updated successfully)r;   rD   r   r   r   r	   rC   rd   r   rO   modified_count)	r4   r   r~   r   r=   r#   r   r   results	            r2   update_addressr      sJ    #7++K+|444GEIIDIIKK$5$5$7$7IIIK K4IJJJJ{## 
K&'/78	
 	
 	

 IHK4E4E4G4GHHHJ&o//J{E"Z@@	 F
 !!4GHHHH566r<   z(/{user_id}/delete/addresses/{address_id}c                    t          |           }t          ||           t          d          }|                    d|d         idd|iidt	          j                    id          }|j        dk    rt          dd	          d
diS )Nr#   r6   rU   rL   z$pullrc   r   r7   r   r-   rW   zAddress removed successfully)r;   rD   r   rd   r   rO   r   r	   )r4   r   r   r=   r#   r   s         r2   delete_addressr   
  s     #7++K+|444GE	E"#!E:#67 (/"3"34	
 	
 F !!4GHHHH566r<   z/{user_id}/wishlistc                    t          |           }t          ||           t          d          }t          fd|                    dg           D             d           }|rt          dd          j        j        t          j	                    d}|
                    d|d         id|id	t          j	                    id
           d|dS )Nr#   c              3   z   K   | ]5}|d          j         k    r"|                    d          j        k    1|V  6dS )	productId	variantIdN)r   rC   r   )r   itemr~   s     r2   	<genexpr>z"add_to_wishlist.<locals>.<genexpr>,  s\       	
 	
K DN22%%77  8777		
 	
r<   rT   r,   zItem already in wishlistr-   )r   r   addedAtr6   rL   r   zAdded to wishlist)rW   rT   )r;   rD   r   nextrC   r	   r   r   r   rO   rd   )r4   r~   r   r=   r#   existsentrys    `     r2   add_to_wishlistr   !  s    #7++K+|444GE	
 	
 	
 	
#
B77	
 	
 	
 	 F  P4NOOOO ^^?$$ E 
	E"# %( (/"3"34	
 	
   +>>>r<   z/delete/{user_id}/wishlistc                 >   t          |           }t          ||           t          d          }d|j        i}|j        r
|j        |d<   |                    d|d         id|idt          j                    id          }|j        dk    rt          d	d
          ddiS )Nr#   r   r   r6   rT   rL   r   r   r7   zItem not found in wishlistr-   rW   zRemoved from wishlist)
r;   rD   r   r   r   rd   r   rO   r   r	   )r4   r~   r   r=   r#   
pull_queryr   s          r2   remove_from_wishlistr   I  s     #7++K+|444GEt~.J~ 1"&.
;	E"# *- (/"3"34	
 	
 F !!4PQQQQ.//r<   c                 p    t          |           }t          ||           d|                    dg           iS )NrT   r   r   s      r2   get_wishlistr   e  s:    
 #7++K+|444
B7788r<   )r'   )Cr   typingr   r   bsonr   fastapir   r   r	   r
   fastapi.securityr   r   	app.db.dbr   app.models.Userr   r   r   r   r   r   r   r   r   r   r   r   r   r   app.utility.otpr   r   r   app.utility.securityr   r    r!   r"   routerauth_schemerB   r3   r;   rD   rP   postr`   rV   rm   rp   ru   rz   rC   r}   putr   ro   r   r   r   deleter   r   r   r   r   r<   r2   <module>r      s                       ; ; ; ; ; ; ; ; ; ; ; ; E E E E E E E E                                       S R R R R R R R R R W W W W W W W W W W W W	('	3	3	3jE***Q QS Q QX Q Q Q Qc d38n    VtCH~ V$sCx. VUY V V V V
d38n 
 
 
 
 
 [w: w w w w0 _6~ 6 6 6 6 Xm44E E E E 54E   D/ D D D ! D &''8!5 8 8 8 ('8 BIAUAU  ">    $ E'**G$%%    +*  99189I1J1J & &* & & & :9&  4;G<L4M4M 8 8- 8 8 8  8 "##4)ABBB)**; ;; ; ; $#; '(( )**I II
I I I )(I6 /00
 )**	7 777 7 7 7 107B 9:: )**7 777 7 7 ;:7, "## )**$? $?$?
$? $? $? $#$?N +,, )**0 00
#0 0 0 -,06 !$sCx.AA )**9 99 9 9 BA9 9 9r<   