o
    <h                     @   sz   d dl mZmZmZmZ 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mZ d dlmZ G d	d
 d
ZdS )    )DictListAnyOptional)datetimeN)RoleplayScenario)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defddZ	ddededed	edede
e fddZded	edefddZded	ede
eeeef   fddZded	ede
ee  fddZded	edefddZded	ede
eeef  fddZdS ) RoleplayEngineNc                 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/roleplay_engine.py__init__   s   zRoleplayEngine.__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RoleplayEngine._get_ai_serviceFscenariois_adminforce_restartreturnc              	   C   s~   |j }| j||}|rtd n|rtd |S td ||j t  ddd|jt  dgd}| j||| |S )	zStart a new roleplay sessionzFDEBUG: Force restarting conversation - replacing existing conversationz8DEBUG: Conversation already exists, not creating new onez7DEBUG: No existing conversation found, creating new oneactive   systemturn_numberspeakermessage	timestamp)
session_idscenario_id
started_atstatusturns)	r"   r   load_conversationprintr   now	isoformatscenario_introsave_conversation)r   r   r   r   r"   existing_conversationconversation_datar   r   r   start_session   s*   


zRoleplayEngine.start_sessionTr"   learner_messagec                 C   s   | j ||}|sdS t|d d }|d|t  d}|d | dd |d D }	t|	dk}
dd |d dd	 D }| |}||	 ||}|sSdS |d d
|t  d}|d | | j 
||| |S )z%Add learner response and get AI replyNr&   r   learnerr   c                 S   s   g | ]
}|d  dkr|qS )r   r1   r   .0turnr   r   r   
<listcomp>L   s    z7RoleplayEngine.add_learner_response.<locals>.<listcomp>c                 S   s*   g | ]}|d  dkr|d  |d dqS )r   r   r    )r   r    r   r2   r   r   r   r5   Q   s    ai)r   r'   lenr   r)   r*   appendr   play_characterto_dictr,   )r   r"   r   r0   r   r   r.   r   learner_turnlearner_turnsis_first_learner_responseconversation_history
ai_serviceai_responseai_turnr   r   r   add_learner_response9   s>   

	
z#RoleplayEngine.add_learner_responsec                 C   s>   | j ||}|sdS d|d< t  |d< | j |||S )zEnd a roleplay sessionF	completedr%   ended_at)r   r'   r   r)   r*   r,   r   r"   r   r.   r   r   r   end_sessionr   s   zRoleplayEngine.end_sessionc                 C   s   | j ||}|sdS |d S )zGet full conversation historyNr&   )r   r'   rF   r   r   r   get_conversation_history}   s   z'RoleplayEngine.get_conversation_historyc                 C   sV   | j ||}|sdS g }|d D ]}t|d |d |d |d d}|| q|S )z/Get conversation turns formatted for assessmentNr&   r   r   r    r!   r   )r   r'   r   r9   )r   r"   r   r.   r&   	turn_datar4   r   r   r   %get_conversation_turns_for_assessment   s   z4RoleplayEngine.get_conversation_turns_for_assessmentc                 C   s&   | j ||}|sdS |dddkS )z"Check if a session is still activeFr%   r   )r   r'   getrF   r   r   r   is_session_active   s   z RoleplayEngine.is_session_activec                 C   sJ   | j ||}|sdS |d |d |d |ddt|d |dd	S )
zGet basic session informationNr"   r#   r$   r%   r   r&   rE   )r"   r#   r$   r%   
turn_countrE   )r   r'   rK   r8   rF   r   r   r   get_session_info   s   

zRoleplayEngine.get_session_info)NN)F)T)__name__
__module____qualname__r   boolr   r   intstrr/   r   rC   rG   r   r   r   rH   r   rJ   rL   rN   r   r   r   r   r   
   s    
($9&&r   )typingr   r   r   r   r   uuidmodels.scenarior   models.assessmentr   services.groq_servicer	   services.ollama_servicer
   utils.json_handlerr   r   r   r   r   r   <module>   s    