o
    jho$                     @   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d
e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   [/var/www/eduai.edurigo.com/doc_train/edurigo_ai/roleplay/testing/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   s  dd |D }|s|  ||||S dd |D }| |}|| |}	|	s)dS zg }
|jD ].}||	d v r]|	d | }t|t|dd|dg |d	g |d
g d}|
| q/|
rnt	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 d kr|qS )learner)speaker.0turnr   r   r   
<listcomp>   s    z1SkillAnalyzer.analyze_session.<locals>.<listcomp>c                 S   s   g | ]	}|j |jd qS )r   messager#   r   r   r   r   r"      s    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>@   s    z0SkillAnalyzer.analyze_session.<locals>.<genexpr>           conversation_analysisrecommendationsr   scenario_idoverall_scoreperformance_levelskill_scoresr   r/   r0   z1DEBUG: Attempting to save assessment for session z$DEBUG: Assessment saved successfullyz DEBUG: Failed to save assessmentz"Error processing analysis result: )_create_zero_assessmentr   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   learner_turnsconversation_data
ai_serviceanalysis_resultr5   r+   
skill_dataskill_scorer3   r4   
assessmenter   r   r   analyze_session   sb   
	







zSkillAnalyzer.analyze_sessionc           	      C   s   g }|j D ]}t|ddgg dgd}|| qtj||jdd||g g dgdd	gd
gg dd}td|  | j|	 |rGtd |S td dS )zBCreate assessment with zero scores when learner didn't participater   z1No learner responses detected in the conversationz1Participate actively in the roleplay conversationr*   r-   zNo Participationz7Complete lack of participation in the roleplay scenario)r(   critical_momentsmissed_opportunitiesz-Start participating in roleplay conversationsz/Begin with simple greetings and basic responses)immediate_focuspractice_suggestionsadvanced_skillsr1   zIDEBUG: Creating zero assessment for non-participating learner in session z)DEBUG: Zero assessment saved successfullyz%DEBUG: Failed to save zero assessmentN)
r9   r   r<   r   r@   r   rB   r   rC   r8   )	r   r   r   r   r   r5   r+   rJ   rK   r   r   r   r6   `   s@   
z%SkillAnalyzer._create_zero_assessmentr3   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   r3   r   r   r   r?      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   rW      s   
zSkillAnalyzer.load_assessmentc                 C   s   | j |S )zList all assessments)r   list_assessments)r   r   r   r   r   rZ      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)r<   r3   r5   r+   r&   itemsrA   r=   r>   max_calculate_trend)	r   r[   rI   overall_scoresrK   rJ   r+   skill_averagesscoresr   r   r   get_skill_summary   s4   
zSkillAnalyzer.get_skill_summaryrl   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)r>   r=   )r   rl   
recent_avg	early_avgr`   r   r   r   ri      s     zSkillAnalyzer._calculate_trend)NN)T)__name__
__module____qualname__r   boolr   strr   r   r	   r:   r   r   rM   r6   floatr?   rW   r   r   rZ   rm   ri   r   r   r   r   r      s2    


M
-%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    