
    k)i4                     z   d Z ddlmZmZmZmZmZ ddlmZmZ ddl	Z	ddl
Z
ddlmZmZ 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 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l$m%Z% ddl&m'Z'  e
jP                  e)      Z*dede+deeee,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ddddddgdddf
dedee,   dee,   dee,   dee,   de+de+dee,   de+d e+d!e0deee   ef   fd"Z1	 	 	 	 	 	 d,ded#ed$ee,   d%e0d&e0d'e,deeeedf   e,f   fd(Z2dede+d#e dee   fd)Z3dede+dee   fd*Z4dede+dee   fd+Z5y)-z9
User Services for handling user-related business logic.
    )DictListOptionalTupleUnion)datetimetimeN)HTTPExceptionstatus)selectand_or_funcdescasc)Session)IntegrityError)EmailStr)User)UserResponseSchemaUserCreateSchemaUserUpdateSchema)encrypt_passwordverify_password)generate_secure_id)QueryPaginatordbuser_idreturnc                    	 t        t              j                  t        j                  |k(        }t	        t        d      r.|j                  t        j
                  j                  d            }| j                  |      j                         }|rt        j                  |      dfS y# t        $ r/}t        j                  d|        dt        |      fcY d}~S d}~ww xY w)zGet user by ID.
deleted_atNz
User found)NzUser not foundzError getting user: )r   r   whereidhasattrr!   is_executescalar_one_or_noner   model_validate	Exceptionloggererrorstr)r   r   stmtresultes        U/var/www/html/hwPaymentPortal-be-dev/hw-payment-portal-api/src/apps/users/services.pyget_userr1      s    d|!!$''W"454&::doo11$78DD!446&55f=|LL' +A3/0c!f~s   B$B( (	C 1$CC C c                 x   	 t        t              j                  t        j                  |k(        }t	        t        d      r.|j                  t        j
                  j                  d            }| j                  |      j                         S # t        $ r"}t        j                  d|        Y d}~yd}~ww xY w)zGet raw user model by ID.r!   NzError getting raw user: )r   r   r"   r#   r$   r!   r%   r&   r'   r)   r*   r+   )r   r   r-   r/   s       r0   get_user_rawr3   (   s    d|!!$''W"454&::doo11$78Dzz$2244 /s34s   BB 	B9B44B9emailc                    	 t        t              j                  t        j                  |k(        }t	        t        d      r.|j                  t        j
                  j                  d            }| j                  |      j                         }|rt        j                  |      S y# t        $ r"}t        j                  d|        Y d}~yd}~ww xY w)zGet user by email.r!   NzError getting user by email: )r   r   r"   r4   r$   r!   r%   r&   r'   r   r(   r)   r*   r+   )r   r4   r-   r.   r/   s        r0   get_user_by_emailr6   5   s    d|!!$**"564&::doo11$78DD!446%44V<< 4QC89s   B"B& &	C/CCz-created_at   Tsearchnamephone	is_activeis_verifiedsort_byskiplimitpaginatec           
      
   	 t        t              }t        t        d      r.|j                  t        j                  j                  d            }|rg }t        t        d      r2|j                  t        j                  j                  d| d             t        t        d      r2|j                  t        j                  j                  d| d             |j                  t        j                  j                  d| d             t        t        dd      xs t        t        dd      }|$|j                  |j                  d| d             t        t        d      ret        t        d      rU|j                  t        j                  t        j                  dt        j                        j                  d| d             |r|j                  t        |       }|rg }t        t        d      r2|j                  t        j                  j                  d| d             t        t        d      r2|j                  t        j                  j                  d| d             t        t        d      ret        t        d      rU|j                  t        j                  t        j                  dt        j                        j                  d| d             |r|j                  t        |       }|r2|j                  t        j                  j                  d| d            }|rJt        t        dd      xs t        t        dd      }|$|j                  |j                  d| d            }|d	k7  r%|j                  t        j                   |d	kD  k(        }|d	k7  r%|j                  t        j"                  |d	kD  k(        }|rg }|D ]{  }|j%                  d
d      }t        t        |      s&t        t        |      }|j'                  d
      r|j                  t)        |             b|j                  t+        |             } |r |j,                  | }|
rt/        |t0        | t        d||	d      }|j3                         }|j4                  |j6                  |j8                  |j:                  |j<                  |j>                  |j@                  |jB                  dS | jE                  |      jG                         jI                         }|S # tJ        $ r/}tL        jO                  d|        dtQ        |      icY d}~S d}~ww xY w)z-Get users list with filtering and pagination.r!   N
first_name%	last_namer:   phone_number r   - z/api/v1/usersT)queryschemar   modelurloffsetr?   use_orm)datatotalpageper_pagenextpreviousfirstlastzError getting users list: r+   ))r   r   r$   r"   r!   r%   appendrB   ilikerD   r4   getattrliker   concatr   r;   r<   replace
startswithr   r   order_byr   r   r@   r.   rP   rQ   rR   rS   rT   rU   rV   r&   scalarsallr)   r*   r+   r,   )r   r8   r9   r4   r:   r;   r<   r=   r>   r?   r@   r-   
conditionsphone_fieldname_conditionsorder_clauses
sort_fieldcol_namesort_column	paginatorpagination_resultresultsr/   s                          r0   get_users_listrk   E   se   i!d|4&::doo11$78D Jt\*!!$//"7"7!F81"FGt[)!!$.."6"66(!}"EFdjj..6(!}=>!$6]'$X\:]K&!!+"2"2Qvha="ABt\*wt[/I!!KKdnnEKKaPVxWXMZ zz#z"23  Ot\*&&t'<'<qa['IJt[)&&t~~';';avQK'HIt\*wt[/I&&KKdnnEKKaPTvUVKX zz#"78 ::djj..5'|<=D!$6]'$X\:]K&zz+"2"2QugQ<"@A>::dnnQ?@D!::d..;?CDD M% ?
%--c264*")$"9K!,,S1%,,T+->?%,,S-=>? $t}}m4 &)#	I !* 2 2 4 *00*00)..-66)..-66*00)..	 	 jj&..0446GN !1!56Q  !s+   O6T 9C0T *.T 	U"$UUU	user_datapasswordis_owneris_customeridentifier_typec           
         	 |xs |j                   }|syt        t              j                  t	        t        j
                  |j
                  k(  t        t        d      rt        j                  j                  d      nd            }	| j                  |	      j                         }
|
ryt        t              j                  t	        t        j                  |j                  k(  t        t        d      rt        j                  j                  d      nd            }| j                  |      j                         }|ry|dk(  rt        |d      r|j                  rt        t        dd      xs t        t        dd      }|t        t              j                  t	        ||j                  k(  t        t        d      rt        j                  j                  d      nd            }| j                  |      j                         }|ry	t        |j
                  |j                  |j                  |j                  |j                   |j                  |j"                  |j$                  
      }t'        |      }|r|j)                  d      |_        nyt        |d      r|j-                          t        |d      r|j.                  	 t1        dd      |_        | j9                  |       | j;                          | j=                  |       t?        j@                  |      dfS #  dt3        t5        j6                               dd  |_        Y uxY w# tB        $ rT}| jE                          dt3        |jF                        v rd}ndt3        |jF                        v rd}nd}d|fcY d}~S d}~wtH        $ rB}| jE                          tJ        jM                  d|        ddt3        |       fcY d}~S d}~ww xY w)zCreate a new user.)NzPassword is requiredr!   NT)N#User with this email already exists)N&User with this username already existsr:   rE   )Nz*User with this phone number already exists)r4   usernamerB   middle_namerD   r:   r;   r<   zutf-8)NzFailed to encrypt passwordupdate_full_namer   usrr7   )prependlengthusr_zUser created successfullyr4   rr   rt   rs   zDuplicate user datazError creating user: zPassword encryption failed: )'rm   r   r   r"   r   r4   r$   r!   r%   r&   r'   rt   r:   rY   rB   ru   rD   r;   r<   r   decodehashed_passwordrv   r   r   r,   uuiduuid4addcommitrefreshr   r(   r   rollbackorigr)   r*   r+   )r   rl   rm   merchantcustomerrn   ro   rp   password_to_use
email_stmtexisting_email_userusername_stmtexisting_username_userrb   
phone_stmtexisting_phone_useruser_objencrypted_passwordr/   err_msgs                       r0   create_userr      sI   ]?"8i&8&81 D\''

ioo--4T<-H##D)d

 !jj4GGI@ t**!3!33-4T<-H##D)d
 "$M!:!M!M!O!C g%')W*E)//!$6]'$X\:]K&#D\//#y65<T<5P++D1VZ
 ')jj&<&O&O&Q#&O //'' ++!--))//))!--	
 .o>'9'@'@'IH$7 8/0%%' x+x/?/?/GC#5eB#O  	x
		


8 #11(;=XYYC%)#djjl*;CR*@)A#B   
c!&&k!;G3qvv;&>G+Gg ?
,QC014SVH=>>?sj   M BM )BM =CM BM 4M L AM *M
M 	O3A	N%O3%O317O.(O3.O3c                    	 t        t              j                  t        j                  |k(        }t	        t        d      r.|j                  t        j
                  j                  d            }| j                  |      j                         }|sy|j                  d      j                         D ]  \  }}t	        ||      st        |||       ! t	        |d      r$t        fddD              r|j                          | j                          | j                  |       t!        j"                  |      S # t$        $ r2}| j'                          t(        j+                  d|        Y d}~yd}~ww xY w)	zUpdate user.r!   NT)exclude_unsetrv   c              3   &   K   | ]  }|v  
 y w)N ).0fieldupdate_datas     r0   	<genexpr>zupdate_user.<locals>.<genexpr>@  s       5CeUk5I  5Cs   )rB   ru   rD   zError updating user: )r   r   r"   r#   r$   r!   r%   r&   r'   
model_dumpitemssetattranyrv   r   r   r   r(   r)   r   r*   r+   )	r   r   rl   r-   userr   valuer/   r   s	           @r0   update_userr   *  s:   d|!!$''W"454&::doo11$78Dzz$224  ***>'--/ 	,LE5tU#eU+	,
 4+,  5C  XB  5C  2C!!#
		


4!0066 
,QC01s%   BD< 4D< A4D< <	E7(E22E7c                    	 t        t              j                  t        j                  |k(        }t	        t        d      r.|j                  t        j
                  j                  d            }| j                  |      j                         }|syt        j                  |      }| j                  |       | j                          |S # t        $ r2}| j                          t        j!                  d|        Y d}~yd}~ww xY w)zHard delete user.r!   NzError deleting user: )r   r   r"   r#   r$   r!   r%   r&   r'   r   r(   deleter   r)   r   r*   r+   )r   r   r-   r   user_responser/   s         r0   delete_userr   N  s    d|!!$''W"454&::doo11$78Dzz$224*99$?
		$
		 
,QC01s   BC	 7C	 		D(C??Dc                 @   	 t        t              j                  t        j                  |k(        }t	        t        d      r.|j                  t        j
                  j                  d            }| j                  |      j                         }|syt	        |d      r9t        j                         |_        | j                          d||j
                  dS t        | |      S # t        $ r2}| j                          t        j!                  d|        Y d}~yd}~ww xY w)zSoft delete user.r!   NzUser soft deleted successfully)messager   r!   zError soft deleting user: )r   r   r"   r#   r$   r!   r%   r&   r'   r   utcnowr   r   r)   r   r*   r+   )r   r   r-   r   r/   s        r0   soft_delete_userr   e  s    d|!!$''W"454&::doo11$78Dzz$2244&&oo/DOIIK <""oo  r7++ 
1!56s%   BC" AC" C" "	D+(DD)NNNFFr4   )6__doc__typingr   r   r   r   r   r   r	   r}   loggingfastapir
   r   
sqlalchemyr   r   r   r   r   r   sqlalchemy.ormr   sqlalchemy.excr   pydantic.networksr   src.apps.users.models.userr   "src.apps.users.schemas.user_commonr   r   r   src.core.utils.passwordr   r   src.apps.base.utils.functionsr   src.helpers.paginationr   	getLogger__name__r*   intr,   r1   r3   r6   boolrk   r   r   r   r   r       r0   <module>r      sq   6 5 #   ) 9 9 " ) & + e e E < 1			8	$ 3 8E:Lc:Q4R+S  
W 
s 
x~ 
' ( x@R7S $ !'w!w!SMw! 3-w! C=	w!
 C=w! w! w! #Yw! w! w! w! 4:tw!z #"h?h?h? smh? h? h? h? 5#T4/0#56h?V!!!  !  !	!HG c h7I.J . 3 8D> r   