o
    t0h                     @   sn   d dl mZ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 d dlmZ G dd dZd	S )
    )DictListAnyOptional)RoleplayScenario)SkillAssessment
SkillScoreConversationTurn)GroqService)OllamaService)JSONHandlerc                   @   s   e Zd ZdddZdefddZ	dded	ed
ee	 de
dedee fddZdedefddZdede
dee fddZde
deeeef  fddZdee deeef fddZdee defddZdS )SkillAnalyzerNc                 C   s$   |pt  | _|p
t | _t | _d S N)r
   groq_servicer   ollama_servicer   json_handler)selfr   r    r   X/var/www/eduai.edurigo.com/doc_train/edurigo_ai/roleplay/prod/services/skill_analyzer.py__init__	   s   zSkillAnalyzer.__init__use_groqc                 C   s   |r| j S | jS )z9Get the appropriate AI service based on groqRoleplay flag)r   r   )r   r   r   r   r   _get_ai_service   s   zSkillAnalyzer._get_ai_serviceT
session_idscenarioconversation_turnsis_adminreturnc                 C   sj  dd |D }|  |}|| |}|sdS zg }	|jD ].}
|
|d v rL|d |
 }t|
t|dd|dg |dg |d	g d
}|	| q|	r]tdd |	D t	|	 }nd}| 
|}tj||jt|d||	||di |di d}td|  | j| |rtd |W S td W dS  ty } ztd|  W Y d}~dS d}~ww )z;Perform comprehensive skill analysis on a completed sessionc                 S   s   g | ]	}|j |jd qS )speakermessager   ).0turnr   r   r   
<listcomp>   s    z1SkillAnalyzer.analyze_session.<locals>.<listcomp>Nskill_analysisscorer   evidence	strengthsimprovement_areas)
skill_namer$   r%   r&   r'   c                 s   s    | ]}|j V  qd S r   )r$   )r    r$   r   r   r   	<genexpr>9   s    z0SkillAnalyzer.analyze_session.<locals>.<genexpr>g           conversation_analysisrecommendations)r   scenario_idoverall_scoreperformance_levelskill_scoresr   r+   r,   z1DEBUG: Attempting to save assessment for session z$DEBUG: Assessment saved successfullyz DEBUG: Failed to save assessmentz"Error processing analysis result: )r   analyze_skillsto_dictskills_to_assessr   intgetappendsumlen_determine_performance_levelr   
create_newr   roundprintr   save_assessment	Exception)r   r   r   r   r   r   conversation_data
ai_serviceanalysis_resultr0   r(   
skill_dataskill_scorer.   r/   
assessmenter   r   r   analyze_session   s\   
	







zSkillAnalyzer.analyze_sessionr.   c                 C   s(   |dkrdS |dkrdS |dkrdS dS )z2Determine performance level based on overall scoreg      "@Expertg      @Advancedg      @IntermediateBeginnerr   )r   r.   r   r   r   r9   Y   s   z*SkillAnalyzer._determine_performance_levelc                 C   s    | j ||}|rt|S dS )zLoad an existing assessmentN)r   load_assessmentr   	from_dict)r   r   r   assessment_datar   r   r   rK   d   s   
zSkillAnalyzer.load_assessmentc                 C   s   | j |S )zList all assessments)r   list_assessments)r   r   r   r   r   rN   k   s   zSkillAnalyzer.list_assessmentsassessmentsc           	      C   s   |si S i }g }|D ]!}| |j |jD ]}|j}||vr"g ||< ||  |j qq
i }| D ](\}}tt|t| dt	||d t|dkrT|d |d  ndd||< q2t|tt|t| dt	||d || 
|dS )z7Generate summary statistics across multiple assessmentsr*   r   )average_score
best_scorelatest_scoreimprovement)total_sessionsoverall_averagebest_overalllatest_overallskill_breakdownperformance_trend)r6   r.   r0   r(   r$   itemsr;   r7   r8   max_calculate_trend)	r   rO   rB   overall_scoresrD   rC   r(   skill_averagesscoresr   r   r   get_skill_summaryo   s4   
zSkillAnalyzer.get_skill_summaryr`   c                 C   st   t |dk rdS t|dd t |dd  }t|dd t |dd  }|| }|dkr2dS |dk r8d	S d
S )zCalculate performance trend   zInsufficient dataN   g      ?	Improvingg      	DecliningStable)r8   r7   )r   r`   
recent_avg	early_avgrT   r   r   r   r]      s     zSkillAnalyzer._calculate_trend)NN)T)__name__
__module____qualname__r   boolr   strr   r   r	   r4   r   r   rF   floatr9   rK   r   r   rN   ra   r]   r   r   r   r   r      s$    

F%r   N)typingr   r   r   r   models.scenarior   models.assessmentr   r   r	   services.groq_servicer
   services.ollama_servicer   utils.json_handlerr   r   r   r   r   r   <module>   s    