o
    ufi-*                     @   s   d dl mZ d dlZddlmZ d dlmZ d dlmZ d dl	Z	d dl
Z
d dlZd dlZejdejdd	 ed
 ed ed G dd dZdS )    )HTTPExceptionN   )HashGenerator)UserJourney)Pathzapp.logz)%(asctime)s - %(levelname)s - %(message)s)filenamelevelformatzApplication startedzThis is a warningzThis is an error messagec                   @   s|   e Zd Zdd Zdd Zdd ZddlZd	d
 Zdd Zdd Z	dd Z
dd Zdd Zdd Zdd Zdd Zdd ZdS )EvaluationServicec                 C   s   t  | _|| _t|| _td| j d| _td| j d| _td| j d| _	td| j d| _
td| j d| _d S )Nzparsed_course_content/z.jsonzaudio/stage//zaudio/questions/zupdated_content/z	question/)r   crew_instance
input_datar   generate_input_hash
input_hashr   parsedsession_audiosession_questionsession_contentsession_question_md)selfr    r   /home/azureuser/microlearn/backend/user_journey_with_openai/agentic_workflow/src/user_journey_service/services/evaluation_service.py__init__   s   zEvaluationService.__init__c                 C   s   dd t | jD }dd t | jD }tdd |D }g }|D ]}t j|d }||vr6|| q#|r=d|fS d|fS )	Nc                 S      g | ]	}| d r|qS .mdendswith.0fr   r   r   
<listcomp>#       z9EvaluationService.verify_stage_md_wav.<locals>.<listcomp>c                 S   r   ).wavr   r   r   r   r   r!   $   r"   c                 s   s     | ]}t j|d  V  qdS )r   N)ospathsplitextr   r   r   r   	<genexpr>&   s    z8EvaluationService.verify_stage_md_wav.<locals>.<genexpr>r   FT)r$   listdirr   r   setr%   r&   append)r   md_files	wav_fileswav_stages_setmissingmd_file
stage_namer   r   r   verify_stage_md_wav"   s   
z%EvaluationService.verify_stage_md_wavc                 C   sZ   t j| jst j| jsdddS t| jd}t| t| jd}t| |S )NfailurezAudio files are not generated.)statusmessage*.wav)r$   r%   existsr   r   sortedglobprint)r   audio_wav_filesquestion_wav_filesr   r   r   get_audio_files2   s   
z!EvaluationService.get_audio_filesr   Nc           
      C   s   |   \}}|rDtdd t| jD }g }|D ](}tj|d }| d}tj| j|}tj| j|}	|	|||	d q|S |S )Nc                 S   r   r   r   r   r   r   r   r!   E   r"   zAEvaluationService.generate_stage_file_mapping.<locals>.<listcomp>r   r#   )stagemd_pathwav_path)
r1   r7   r$   r(   r   r%   r&   joinr   r*   )
r   matchr.   r+   
stage_datar/   r0   wav_filer>   r?   r   r   r   generate_stage_file_mapping>   s    

z-EvaluationService.generate_stage_file_mappingc                 C   s   t | jd}t|}W d    n1 sw   Y  t|d ddD ]+\}}d| d}d| d}d| |d< tj| j||d	< tj| j	||d
< q#|d S )Nrstages   startr=   r#   r   stage_nor>   r?   )
openr   jsonload	enumerater$   r%   r@   r   r   )r   filedatair=   rC   r/   r   r   r   +update_parsed_course_content_old_13_01_2026Y   s   z=EvaluationService.update_parsed_course_content_old_13_01_2026c                 C   s   t | jd}t|}W d    n1 sw   Y  g }t|d ddD ]J\}}t|d ddD ]=\}}d| d| d| }| d	}	| d
}
|||| d| |ddtj| j	|
tj| j
|	d}|| q1q%|S )NrE   modulesrG   rH   lessonsmodule_lesson_r#   r   .content )file_prefix	module_no	lesson_nofull_lesson_idrY   r>   r?   )rK   r   rL   rM   rN   getr$   r%   r@   r   r   r*   )r   rO   rP   all_lessons
module_idxrU   
lesson_idxlessonr[   rC   r/   lesson_datar   r   r   update_parsed_course_contentg   s(   



z.EvaluationService.update_parsed_course_contentc                 C   s^   |d }t d|  |d }t|ddd}| }W d    n1 s%w   Y  ||dS )Nr>   zThe md path is : r?   rE   utf-8encoding)rY   audio)r9   rK   read)r   rB   r>   audio_contentr    rY   r   r   r   display_content   s   

z!EvaluationService.display_contentc                 C   s   t d}|jjj}|jj}|j}td| td| td| |d }| j| }t|ddd}| }W d    n1 s>w   Y  z d	| d
}	t	|	|}
|
rb|

d }td| d| W n	   | |}Y ||dS )Nz=audio/questions/f3aafd4c95c9b2d02af0b6e68e65745d/stage1/1.wavzHash ID:zStage:zPrefix:r   rE   rf   rg   z### Qz:\s*(.*)rG   zQuestion for prefix :)questionri   )r   parentnamestemr9   r   rK   rj   researchgroupstripwav_to_text_whisper)r   rO   phash_idr=   prefixqn_stage_filer    rY   patternrA   rn   r   r   r   display_question   s,   






z"EvaluationService.display_questionc           
      C   s   | j  }td|  i }|d }|d }|d }d}|t| j d | d }td|  tt|d}	td	|	  d
d |	D S )NThe inputs are : r>   r?   rJ   zQ/home/azureuser/microlearn/backend/user_journey_with_openai/agentic_workflow/src/r   the audio questions are in : r5   the question wav files are : c                 S   s   g | ]}t |qS r   )strr   r   r   r   r!      s    z.EvaluationService.list_qns.<locals>.<listcomp>)r   dictr9   r   r   r7   r   r8   )
r   rB   inputsall_qns_answerstage_contentrk   stage_value	full_pathaudio_questionr,   r   r   r   list_qns   s   
zEvaluationService.list_qnsc                 C   s   | j  }td td|  t|}t| | |}td td ttd}||d< ||d< | j }|j	|d}|j
S )	NzJust before wav printr}   /   🎤 Press Enter when you're ready to answer...    📢 Listening to your answer...Enter your answer: rn   answerr   )r   r   r9   r   rv   inputr   r   evaluator_crewkickoffraw)r   rC   r   r?   rn   r   crewfeedbackr   r   r   evaluate_individual_qn   s   


z(EvaluationService.evaluate_individual_qnc                 C   s6   | j  }||d< ||d< | j }|j|d}|jS )Nrn   r   r   )r   r   r   r   r   r   )r   rn   r   r   r   r   r   r   r   evaluate_individual_qn_ans_pair   s   


z1EvaluationService.evaluate_individual_qn_ans_pairc                 C   s   | j  }td|  i }|d }|d }|d }t| jd | d }td|  tt|d}td|  |D ]0}	t|	 | |	}
t	d	 td
 tt	d}|
|d< ||d< |||
< | j
 }|j|d q>||d< | j
 }|j|d d S )Nr}   r>   r?   r=   r   r~   r5   r   r   r   r   rn   r   r   users_response)r   r   r9   r   r   r7   r   r8   rv   r   r   r   r   assessment_crew)r   rB   r   r   r   rk   r   r   r,   rC   rn   r   r   r   r   r   run_evaluation   s0   



z EvaluationService.run_evaluationc                 C   s6   t d td}|t|}t d|d  |d S )Nzinside wave to text conversionbaseu   🎤 Transcription:text)r9   whisper
load_model
transcriber   )r   rC   modelresultr   r   r   rv     s
   
z%EvaluationService.wav_to_text_whisper)__name__
__module____qualname__r   r1   r<   r$   rD   rR   re   rl   r|   r   r   r   r   rv   r   r   r   r   r
      s    

r
   )fastapir   r$   utils.hashingr   user_journey_service.crewr   pathlibr   r   rL   rr   loggingbasicConfigINFOinfowarningerrorr
   r   r   r   r   <module>   s$    


