
    rki                     R    d dl mZ d dlmZ d dlZd dlmZ  G d d      Z e       Z	y)    N)settings)Imagec                   B    e Zd Zd Zd
dededz  defdZdededefd	Zy)JobOfferServicec                     t         j                  rRt         j                  dk7  r?t        j                  t         j                         t        j                  d      | _        y d | _        y )Nzyour-gemini-key)api_keyzgemini-flash-latest)r   GEMINI_API_KEYgenai	configureGenerativeModelmodel)selfs    9/home/www/utuvibe.miabetepe.com/app/job_offers/service.py__init__zJobOfferService.__init__   sE    ""x'>'>BS'SOOH$;$;<../DEDJDJ    Nprompt
image_pathreturnc           
        K   | j                   sdddddgddgddd	d
S d}	 | d| g}|r&t        j                  |      }|j                  |       | j                   j	                  |      }|j
                  j                  dd      j                  dd      j                         }t        j                  |      }g d}	|	D ]  }
|
|vst        d|
        |d   j                         j                         }dj                  d |D              }|j                  d      d d }||d<   |S # t        $ r#}t        d|        dd|g g dddd
cY d }~S d }~ww xY ww)Nzexemple-offreu   Offre simuléeuG   Ceci est une offre simulée. Veuillez configurer votre clé API Gemini.u   Prérequis 1u   Prérequis 2u   Responsabilité 1u   Responsabilité 2   Non spécifiéCDI)tagtitledescriptionrequirementsresponsibilitieslocationsalary_rangecontract_typeuA  
        Vous êtes un assistant RH expert en rédaction d'offres d'emploi.
        À partir du prompt de l'utilisateur (et de l'image si fournie), générez une offre d'emploi complète et professionnelle.

        Vous DEVEZ retourner UNIQUEMENT un JSON valide avec cette structure exacte :
        {
            "tag": "slug-court-en-kebab-case décrivant le poste (ex: dev-python-senior, designer-ux, comptable-junior). Maximum 30 caractères.",
            "title": "Titre complet du poste",
            "description": "Description détaillée du poste, de l'entreprise et du contexte",
            "requirements": ["Liste", "des", "prérequis", "et", "qualifications", "requises"],
            "responsibilities": ["Liste", "des", "responsabilités", "et", "missions"],
            "location": "Lieu de travail ou Remote",
            "salary_range": "Fourchette salariale si mentionnée, sinon 'À négocier'",
            "contract_type": "CDI, CDD, Stage, Freelance, etc."
        }

        Règles pour le tag :
        - Kebab-case uniquement (lettres minuscules et tirets)
        - Court et descriptif (ex: dev-kernel, chef-projet-it, stage-marketing)
        - Pas d'accents ni de caractères spéciaux
        - Maximum 30 caractères

        La sortie DOIT être uniquement un JSON valide, sans texte supplémentaire.
        z

Prompt de l'entreprise: ```json ```)r   r   r   zChamp manquant: r   c              3   N   K   | ]  }|j                         s|d k(  r|nd   yw)-N)isalnum).0cs     r   	<genexpr>z5JobOfferService.generate_job_offer.<locals>.<genexpr>H   s#     MAqyy{a3h!C?Ms   #%r$      zGemini Job Offer Error: zoffre-generalezNouvelle offre d'emploiu   À négocier)r   r   openappendgenerate_contenttextreplacestripjsonloads
ValueErrorlowerjoin	Exceptionprint)r   r   r   system_instructioncontent_partsimgresponser-   datarequired_fieldsfieldr   es                r   generate_job_offerz"JobOfferService.generate_job_offer   s    zz&)h!/ @%8:M$N, 0!&	 	2$	 233OPVxXYMjj,$$S)zz22=AH==((B7??rJPPRD::d#D >O( A$$'7w%?@@A
 u+##%++-C''MMMC))C."%CDKK 	,QC01'2% "$&, .!1	 		s<   EB'D, 	A"D, +E,	E5EEEEE	job_offercandidate_datac                 P  K   | j                   sddg g dS d}d|j                  dd       d|j                  d	d       d
t        j                  |j                  dg       d       dt        j                  |j                  dg       d       d|j                  dd       d|j                  dd       }t        j                  |dt              }| d| d| }	 | j                   j                  |      }|j                  j                  dd      j                  dd      j                         }t        j                  |      }	t        dt        dt        |	j                  dd                        |	d<   |	S # t        $ r}
t        d|
        ddg g dcY d}
~
S d}
~
ww xY ww) z6Score a candidate against a job offer using Gemini AI.g        u@   Scoring indisponible. Veuillez configurer votre clé API Gemini.)scoresummary	strengths
weaknessesu  
        Vous êtes un expert en recrutement. Analysez le profil du candidat par rapport à l'offre d'emploi.

        Vous DEVEZ retourner UNIQUEMENT un JSON valide avec cette structure exacte :
        {
            "score": <float entre 0 et 100 représentant le pourcentage de correspondance>,
            "summary": "<synthèse courte de 2-3 phrases expliquant le niveau de correspondance global>",
            "strengths": ["<point fort 1>", "<point fort 2>", ...],
            "weaknesses": ["<point faible ou lacune 1>", "<point faible ou lacune 2>", ...]
        }

        Critères d'évaluation :
        - Compétences techniques demandées vs compétences du candidat
        - Expérience professionnelle (années, postes similaires, secteurs)
        - Formation et certifications pertinentes
        - Langues requises
        - Localisation si pertinente

        Soyez précis et factuel dans vos justifications. La sortie DOIT être uniquement un JSON valide.
        zTitre: r   r!   z
Description: r   u   
Prérequis: r   F)ensure_asciiu   
Responsabilités: r   z
Localisation: r   r   z
Type de contrat: r   )rG   defaultz

=== OFFRE D'EMPLOI ===
z

=== PROFIL CANDIDAT ===
r    r"   g      Y@rC   r   zGemini Scoring Error: u)   Erreur lors de l'évaluation du candidat.N)r   getr0   dumpsstrr,   r-   r.   r/   r1   maxminfloatr5   r6   )r   r@   rA   r7   job_infocandidate_infor   r:   r-   r;   r>   s              r   score_candidatezJobOfferService.score_candidate\   s    zz] 	 , immGR01 2%MM-<= >::immNB&GV[\] ^!!%IMM:Lb,Q`e!f g h&]]:7GHI J  )o?O PQS 	 NPST "" #''/j 1((6'79 		zz226:H==((B7??rJPPRD::d#D  Sdhhw6J0K%LMDMK 	*1#./F 	 	s7   CF&BE; :F&;	F#FF#F&F##F&)N)__name__
__module____qualname__r   rK   dictr?   rQ    r   r   r   r      sI    Js Jd
 JVZ JZ@t @T @d @r   r   )
google.generativeaigenerativeair
   app.core.configr   r0   PILr   r   job_offer_servicerV   r   r   <module>r\      s)    # $  U Up $% r   