o
    I0hl                     @   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   Y/var/www/eduai.edurigo.com/doc_train/edurigo_ai/roleplay/prod/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}
|
r:|j}ndd |d dd	 D }| |}|	|
 ||}|sYd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   T   s    ai)r   r'   lenr   r)   r*   appendconversation_starterr   play_characterto_dictr,   )r   r"   r   r0   r   r   r.   r   learner_turnlearner_turnsis_first_learner_responseai_responseconversation_history
ai_serviceai_turnr   r   r   add_learner_response9   sB   

	
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_sessionu   s   zRoleplayEngine.end_sessionc                 C   s   | j ||}|sdS |d S )zGet full conversation historyNr&   )r   r'   rG   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'   getrG   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&   rF   )r"   r#   r$   r%   
turn_countrF   )r   r'   rL   r8   rG   r   r   r   get_session_info   s   

zRoleplayEngine.get_session_info)NN)F)T)__name__
__module____qualname__r   boolr   r   intstrr/   r   rD   rH   r   r   r   rI   r   rK   rM   rO   r   r   r   r   r   
   s    
($<&&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    