o
    ]<h                     @   sn   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 G dd	 d	ZdS )
    )DictListAnyOptional)datetimeN)RoleplayScenario)ConversationTurn)GroqService)JSONHandlerc                	   @   s   e Zd Zdd ZdedefddZdedededee fd	d
Zdede	fddZ
dedeeeeef   fddZdedeee  fddZdede	fddZdedeeeef  fddZdS )RoleplayEnginec                 C   s   t  | _t | _d S )N)r	   groq_servicer
   json_handler)self r   Y/var/www/eduai.edurigo.com/doc_train/edurigo_ai/roleplay/prod/services/roleplay_engine.py__init__
   s   zRoleplayEngine.__init__scenarioreturnc              	   C   sH   |j }||j t  ddd|jt  dgd}| j|| |S )zStart a new roleplay sessionactive   aiturn_numberspeakermessage	timestamp)
session_idscenario_id
started_atstatusturns)idr   now	isoformatconversation_starterr   save_conversation)r   r   r   conversation_datar   r   r   start_session   s   

zRoleplayEngine.start_sessionr   learner_messagec           
      C   s   | j |}|s
dS t|d d }|d|t  d}|d | dd |d dd D }| j|	 ||}|s?dS |d d	|t  d}	|d |	 | j 
|| |S )
z%Add learner response and get AI replyNr    r   learnerr   c                 S   s   g | ]}|d  |d dqS )r   r   )r   r   r   ).0turnr   r   r   
<listcomp>:   s    z7RoleplayEngine.add_learner_response.<locals>.<listcomp>r   )r   load_conversationlenr   r"   r#   appendr   play_characterto_dictr%   )
r   r   r   r(   r&   r   learner_turnconversation_historyai_responseai_turnr   r   r   add_learner_response'   s8   
	
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   end_sessionZ   s   zRoleplayEngine.end_sessionc                 C   s   | j |}|s
dS |d S )zGet full conversation historyNr    )r   r.   r:   r   r   r   get_conversation_historye   s   z'RoleplayEngine.get_conversation_historyc                 C   sT   | 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   r0   )r   r   r&   r    	turn_datar+   r   r   r   %get_conversation_turns_for_assessmentm   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.   getr:   r   r   r   is_session_active   s   z RoleplayEngine.is_session_activec                 C   sH   | j |}|s
dS |d |d |d |ddt|d |dd	S )
zGet basic session informationNr   r   r   r   r   r    r9   )r   r   r   r   
turn_countr9   )r   r.   r?   r/   r:   r   r   r   get_session_info   s   

zRoleplayEngine.get_session_infoN)__name__
__module____qualname__r   r   strr'   r   r7   boolr;   r   r   r   r<   r   r>   r@   rB   r   r   r   r   r   	   s    3""r   )typingr   r   r   r   r   uuidmodels.scenarior   models.assessmentr   services.groq_servicer	   utils.json_handlerr
   r   r   r   r   r   <module>   s    