
    hi                     x    d 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	m
Z
mZ ddlmZ ddlmZmZ  G d d	      Zy
)z4
Service CRUD pour les utilisateurs avec SQLAlchemy
    )datetime)OptionalListDict)Session)funccastString)User)
UserCreate
UserUpdatec                      e Zd ZdZededefd       Zededede	e   fd       Z
ededede	e   fd	       Zeded
edefd       Zededededefd       Zededededefd       Zededededefd       Zededededefd       Zededededefd       Zededededefd       Zededededefd       Zedededefd       Zedededefd       Zed"dedededee   fd       Zededefd       Zedededefd        Zy!)#UserServiceu8   Service pour gérer les opérations sur les utilisateursuserreturnc                    | j                   rt        | j                   t              r| j                   j                  di       }|rt        |t              r|j                  dg       }|rxt        |t              rhg }|D ]M  }t        |t              rd|v r|j                  |d          ,t        |t              s=|j                  |       O ||d<   || j                   d<   | S )u   
        Nettoyer les skills LinkedIn pour éviter les erreurs Pydantic.
        Transforme les objets {title: "..."} en strings simples.
        scraped_dataskillstitle)linkedin_profile
isinstancedictgetlistappendstr)r   r   r   cleaned_skillsskills        A/home/www/therecruiter.miabetepe.com/app/services/user_service.py_clean_linkedin_skillsz"UserService._clean_linkedin_skills   s       Z0E0Et%L0044^RHL
< >%))(B7j6%'N!' 9%eT2w%7G*11%.A's3*11%8	9 .<L*<HD)).9    dbphone_numberc                     | j                  t              j                  t        j                  |k(        j	                         }|rt
        j                  |       |S )u5   Récupérer un utilisateur par numéro de téléphone)queryr   filterr#   firstr   r    )r"   r#   r   s      r   get_user_by_phonezUserService.get_user_by_phone)   sF     xx~$$T%6%6,%FGMMO..t4r!   user_idc                     | j                  t              j                  t        j                  |k(        j	                         }|rt
        j                  |       |S )u!   Récupérer un utilisateur par ID)r%   r   r&   idr'   r   r    )r"   r)   r   s      r   get_user_by_idzUserService.get_user_by_id1   sD     xx~$$TWW%78>>@..t4r!   	user_datac                 8   t        |j                  |j                  |j                  ddt	        j
                         t	        j
                         t	        j
                               }| j                  |       | j                          | j                  |       |S )u   Créer un nouvel utilisateurinitialF)r#   	full_nameemailconversation_stateregistration_completedlast_interaction
created_at
updated_at)	r   r#   r0   r1   r   utcnowaddcommitrefresh)r"   r-   r   s      r   create_userzUserService.create_user9   sr     "//))//(#(%__.((	
 	t
		


4r!   update_datac                    |j                         D ]"  \  }}t        ||      s|t        |||       $ t        j                         |_        t        j                         |_        | j                          | j                  |       |S )u   Mettre à jour un utilisateur)	itemshasattrsetattrr   r7   r6   r4   r9   r:   )r"   r   r<   keyvalues        r   update_userzUserService.update_userK   st     &++- 	*JCtS!e&7c5)	* #//+ ( 1
		


4r!   	new_statec                     ||_         t        j                         |_        t        j                         |_        | j                          | j                  |       |S )u&   Mettre à jour l'état de conversation)r2   r   r7   r4   r6   r9   r:   )r"   r   rD   s      r   update_statezUserService.update_stateY   sC     #, ( 1"//+
		


4r!   namec                     ||_         t        j                         |_        t        j                         |_        | j                          | j                  |       |S )u   Mettre à jour le nom)r0   r   r7   r4   r6   r9   r:   )r"   r   rG   s      r   update_namezUserService.update_namec   sB      ( 1"//+
		


4r!   r1   c                     ||_         t        j                         |_        t        j                         |_        | j                          | j                  |       |S )u   Mettre à jour l'email)r1   r   r7   r4   r6   r9   r:   )r"   r   r1   s      r   update_emailzUserService.update_emailm   sB     
 ( 1"//+
		


4r!   locationc                     ||_         t        j                         |_        | j	                          | j                  |       |S )u/   Mettre à jour la localisation de l'utilisateur)rL   r   r7   r6   r9   r:   )r"   r   rL   s      r   update_locationzUserService.update_locationw   s3     !"//+
		


4r!   cv_datac                     ||_         t        j                         |_        t        j                         |_        | j                          | j                  |       |S )u!   Mettre à jour les données du CV)rO   r   r7   r4   r6   r9   r:   )r"   r   rO   s      r   update_cv_datazUserService.update_cv_data   sB      ( 1"//+
		


4r!   linkedin_datac                     ||_         t        j                         |_        t        j                         |_        | j                          | j                  |       |S )u$   Mettre à jour les données LinkedIn)r   r   r7   r4   r6   r9   r:   )r"   r   rR   s      r   update_linkedinzUserService.update_linkedin   sC     !. ( 1"//+
		


4r!   c                     d|_         d|_        t        j                         |_        t        j                         |_        | j                          | j                  |       |S )u'   Marquer l'inscription comme complétéeT	completed)r3   r2   r   r7   r4   r6   r9   r:   r"   r   s     r   mark_completedzUserService.mark_completed   sK     '+#"- ( 1"//+
		


4r!   c                     d|_         d|_        i |_        i |_        d|_        d|_        t        j                         |_        t        j                         |_	        | j                          | j                  |       |S )u   Réinitialiser un utilisateurNr/   F)r0   r1   rO   r   r2   r3   r   r7   r4   r6   r9   r:   rW   s     r   
reset_userzUserService.reset_user   sh     
 ""+&+# ( 1"//+
		


4r!   limitoffsetc                    | j                  t              j                  t        j                  j	                               j                  |      j                  |      j                         }|D ]  }t        j                  |        |S )u1   Récupérer tous les utilisateurs avec pagination)
r%   r   order_byr5   descr\   r[   allr   r    )r"   r[   r\   usersr   s        r   get_all_userszUserService.get_all_users   so     ''(<(<(>?FFvNTTUZ[__a  	5D..t4	5 r!   c                    | j                  t        j                  t        j                              j                         }| j                  t        j                  t        j                              j                  t        j                  dk(        j                         }| j                  t        j                  t        j                              j                  t        j                  dk7  t        t        j                  t              dk7        j                         }| j                  t        j                  t        j                              j                  t        j                  dk7  t        t        j                  t              dk7        j                         }|dkD  r||z  dz  ddnd}|xs d|xs d|xs d|xs d|d	S )
z!Obtenir les statistiques globalesTNz{}r   d   z.2f%z0%)total_userscompleted_registrationswith_cvwith_linkedincompletion_rate)r%   r   countr   r+   scalarr&   r3   rO   r	   r
   r   )r"   rf   rV   rh   ri   rj   s         r   	get_statszUserService.get_stats   sa    hhtzz$''23::<HHTZZ01889T9TX\9\]ddf	 ((4::dgg./66LLD v&$.
 &( 	 DGG!45<<!!T)&&/47
 &( 	
 HSUVi+5;SAC\` '+!'0~A|!*/a.
 	
r!   c                     	 | j                  |       | j                          y# t        $ r | j                          Y yw xY w)u2   Supprimer un utilisateur (RGPD - droit à l'oubli)TF)deleter9   	ExceptionrollbackrW   s     r   delete_userzUserService.delete_user   s9    	IIdOIIK 	KKM	s   !$ A A N)rd   r   )__name__
__module____qualname____doc__staticmethodr   r    r   r   r   r(   intr,   r   r;   r   rC   rF   rI   rK   rN   rQ   rT   rX   rZ   r   rb   rm   boolrr    r!   r   r   r      s   BT d  0 g S Xd^   7 S Xd^    J 4  "  t $ 4          t 3 4     S T   G 4 3 4   7 $  $   G 4     7 $ 4   w d t   ' # S d   
g 
$ 
 
6  t   r!   r   N)rv   r   typingr   r   r   sqlalchemy.ormr   
sqlalchemyr   r	   r
   
app.modelsr   app.schemasr   r   r   rz   r!   r   <module>r      s0     ' ' " ) )  .Q Qr!   