
    hi                        d Z ddlmZ ddlmZmZmZmZmZ ddlm	Z	m
Z
mZmZ  G d de	      Z G d de	      Z G d	 d
e	      Z G d de      Z G d de	      Z G d de      Z G d de	      Z G d de	      Z G d de	      Z G d de	      Z G d de	      Z G d de	      Z G d de	      Z G d d e	      Z G d! d"e	      Z G d# d$e	      Zy%)&uC   
Schémas Pydantic avec validation automatique des skills LinkedIn
    )datetime)OptionalDictAnyListUnion)	BaseModelFieldfield_validator
ConfigDictc                   p    e Zd ZU dZ ee      Zee   e	d<    e
d      Z edd      ed               Zy	)
LinkedInScrapedDatau/   Modèle pour les données scrapées de LinkedIndefault_factoryskillsallowextrabeforemodec                     |sg S t        |t              ryt        |      dkD  rkt        |d   t              r|S g }|D ]M  }t        |t              rd|v r|j                  |d          ,t        |t              s=|j                  |       O |S g S )u   
        Convertir automatiquement les objets skills en strings.
        Gère les formats: [{"title": "Python"}, ...] et ["Python", ...]
        r   title)
isinstancelistlenstrdictappend)clsvcleanedskills       3/home/www/therecruiter.miabetepe.com/app/schemas.pyextract_skill_titlesz(LinkedInScrapedData.extract_skill_titles   s     I a3q6A:!A$$ G *eT*w%/?NN5>2s+NN5)	*
 N	    N)__name__
__module____qualname____doc__r
   r   r   r   r   __annotations__r   model_configr   classmethodr%    r&   r$   r   r   	   sE    9d3FDI3 G,LXH-  .r&   r   c                   `    e Zd ZU dZdZee   ed<   dZee	   ed<   dZ
ee	   ed<    ed      Zy)LinkedInProfileu'   Modèle pour le profil LinkedIn completNscraped_dataurl
profile_idr   r   )r'   r(   r)   r*   r1   r   r   r+   r2   r   r3   r   r,   r.   r&   r$   r0   r0   +   s;    126L(./6C# $J$G,Lr&   r0   c                   D    e Zd ZU dZeed<   dZee   ed<   dZee   ed<   y)UserBaseu#   Schéma de base pour un utilisateurphone_numberN	full_nameemail)	r'   r(   r)   r*   r   r+   r7   r   r8   r.   r&   r$   r5   r5   4   s'    -#Ix}#E8C=r&   r5   c                       e Zd ZdZy)
UserCreateu"   Schéma pour créer un utilisateurN)r'   r(   r)   r*   r.   r&   r$   r:   r:   ;   s    ,r&   r:   c                       e Zd ZU dZdZee   ed<   dZee   ed<   dZ	ee   ed<   dZ
eeeef      ed<   dZeeeef      ed<   dZee   ed<   dZee   ed	<   y)

UserUpdateu*   Schéma pour mettre à jour un utilisateurNr7   r8   locationcv_datalinkedin_profileconversation_stateregistration_completed)r'   r(   r)   r*   r7   r   r   r+   r8   r=   r>   r   r   r?   r@   rA   boolr.   r&   r$   r<   r<   @   s|    4#Ix}#E8C="Hhsm"(,GXd38n%,15htCH~.5(,,-1HTN1r&   r<   c                       e Zd ZU dZeed<   dZee   ed<    e	e
      Zeeef   ed<    e	e
      Zeeef   ed<   eed<   eed	<   dZee   ed
<   eed<   eed<    ed      Z edd      ed               Zy)UserResponseu'   Schéma de réponse pour un utilisateuridNr=   r   r>   r?   r@   rA   last_interaction
created_at
updated_atT)from_attributesr   r   c                 v   |rt        |t              r|j                  di       }|rt        |t              r|j                  dg       }|rnt        |t              r^g }|D ]M  }t        |t              rd|v r|j	                  |d          ,t        |t
              s=|j	                  |       O ||d<   ||d<   |S )uP   
        Nettoyer les skills LinkedIn au niveau du schéma de réponse.
        r1   r   r   )r   r   getr   r   r   )r    r!   r1   r   cleaned_skillsr#   s         r$   clean_linkedin_skillsz"UserResponse.clean_linkedin_skillsY   s     At$554L
< >%))(B7j6%'N!' 9%eT2w%7G*11%.A's3*11%8	9 .<L*(4An%r&   )r'   r(   r)   r*   intr+   r=   r   r   r
   r   r>   r   r   r?   rB   rF   r   r   r,   r   r-   rM   r.   r&   r$   rD   rD   K   s    1G"Hhsm"#D9GT#s(^9',T'Bd38nB  +/hx(/d3L'h7  8r&   rD   c                   D    e Zd ZU dZeed<   eed<   eed<   eed<   eed<   y)StatsResponsezStatistiques globalestotal_userscompleted_registrationswith_cvwith_linkedincompletion_rateN)r'   r(   r)   r*   rN   r+   r   r.   r&   r$   rP   rP   p   s"      Lr&   rP   c                   :    e Zd ZU dZeed<   eed<   eed<   eed<   y)HealthResponseu   Réponse du health checkstatus	timestampdatabasetwilioN)r'   r(   r)   r*   r   r+   r   r.   r&   r$   rW   rW   y   s    "KMKr&   rW   c                   N    e Zd ZU dZ edd      Zeed<    edd      Zeed<   y)	MessageRequestu.   Requête pour envoyer un message personnalisé.9   Numéro WhatsApp destinataire (ex: whatsapp:+33612345678)descriptiontozContenu du messagemessageN)	r'   r(   r)   r*   r
   ra   r   r+   rb   r.   r&   r$   r]   r]      s)    8C%`aBa*>?GS?r&   r]   c                   |    e Zd ZU dZ edd      Zeed<    edd      Zeed<    edd	      Z	e
eeef      ed
<   y)TemplateMessageRequestu4   Requête pour envoyer un message via template Twilio.r^   r_   ra   z?SID du template Twilio (ex: HXxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx)content_sidNuH   Variables du template indexées (ex: {'1': 'John', '2': 'Développeur'})	variables)r'   r(   r)   r*   r
   ra   r   r+   re   rf   r   r   r.   r&   r$   rd   rd      sR    >C%`aBaS.opKp*/  CM  +NIxS#X'  Nr&   rd   c                   &    e Zd ZU dZeed<   eed<   y)MessageResponseu   Réponse d'envoi de messagesuccessrb   N)r'   r(   r)   r*   rB   r+   r   r.   r&   r$   rh   rh      s    %MLr&   rh   c                   >    e Zd ZU dZdZeed<   eed<   dZe	e   ed<   y)ErrorResponseu   Réponse d'erreurFri   errorNdetails)
r'   r(   r)   r*   ri   rB   r+   r   rm   r   r.   r&   r$   rk   rk      s"    GTJ!GXc]!r&   rk   c                      e Zd ZU dZ edd      Zeee      e	d<    eddd      Z
ee   e	d	<    eddd
      Zee   e	d<    edd      Zeee      e	d<    edd      Zeee      e	d<    edd      Zeee      e	d<    edd      Zeee      e	d<    edd      Zeee      e	d<    edd      Zee   e	d<    edd      Zee	d<    edddd      Zee	d<    ed d!d"d#      Zee	d$<    eddd%      Zee	d&<   d'd(iZy))ProfileSearchRequestu    Requête de recherche de profilsNu"   Liste de compétences recherchéesr_   r   r   u   Années d'expérience minimum)ger`   min_years_experienceu   Années d'expérience maximummax_years_experienceu   Entreprises ciblées	companiesu   Postes recherchés	positionsu   Diplômes requiseducation_degreesu   Établissements d'enseignementeducation_institutionsu   Langues parlées	languagesu   Localisation géographiquer=   Fu9   Exiger toutes les compétences (AND) ou au moins une (OR)match_all_skillsg        g      ?u&   Score minimum de matching (0.0 à 1.0))rp   ler`   match_threshold      d   u   Nombre de résultats maximumlimitu   Position de départoffsetrI   T)r'   r(   r)   r*   r
   r   r   r   r   r+   rq   rN   rr   rs   rt   ru   rv   rw   r=   rx   rB   rz   floatr~   r   r,   r.   r&   r$   ro   ro      sT   * #(:^"_FHT#Y_*/Hg*h(3-h*/Hg*h(3-h%*4=S%TIxS	"T%*4=Q%RIxS	"R-24EW-XxS	*X27Jj2kHT#Y/k%*4=O%PIxS	"P#D6RSHhsmS #56qrdr"333DlmOUm raC5STE3Ta-BCFCC%t,Lr&   ro   c                       e Zd ZU dZ edd      Zeed<    edd      Zeed<    edd      Z	eed	<    edd
      Z
eed<    eed      Zee   ed<    eed      Zee   ed<    edd      Zee   ed<   y)ProfileMatchScorez Score de matching pour un profil.u   Score global (0.0 à 1.0)r_   overall_scoreu   Score des compétencesskills_scoreu   Score de l'expérienceexperience_scorezScore de la formationeducation_scoreu   Compétences correspondantes)r   r`   matched_skillszEntreprises correspondantesmatched_companiesNu   Années d'expérience totalestotal_years_experience)r'   r(   r)   r*   r
   r   r   r+   r   r   r   r   r   r   r   r   r   r   rN   r.   r&   r$   r   r      s    * 2MNM5N1IJL%J#C5MNeN"34KLOUL %dHf gNDIg#(Kh#itCyi,1$Dc,dHSMdr&   r   c                   .    e Zd ZU dZeed<   eed<   ddiZy)ProfileSearchResultu-   Résultat de recherche avec score de matchingusermatch_scorerI   TN)r'   r(   r)   r*   rD   r+   r   r,   r.   r&   r$   r   r      s    7
""%t,Lr&   r   c                   z    e Zd ZU dZ edd      Zeed<    edd      Ze	e
   ed<    edd      Zeed	<   d
diZy)ProfileSearchResponseu    Réponse de recherche de profils.u   Nombre total de résultatsr_   total_resultsu   Profils trouvésresultsu    Critères de recherche utiliséssearch_criteriarI   TN)r'   r(   r)   r*   r
   r   rN   r+   r   r   r   r   ro   r,   r.   r&   r$   r   r      sL    *s0LMM3M).s@R)SGT%&S,1#Ce,fO)f%t,Lr&   r   N)r*   r   typingr   r   r   r   r   pydanticr	   r
   r   r   r   r0   r5   r:   r<   rD   rP   rW   r]   rd   rh   rk   ro   r   r   r   r.   r&   r$   <module>r      s     3 3 B B) D-i - y  	 	
2 2"8 "JI Y @Y @NY Ni "I "-9 -2
e	 
e-) --I -r&   