o
    ?i                     @   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   G/var/www/eduai.edurigo.com/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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   ai)
session_idscenario_id
started_atstatusturns)
r$   r   load_conversationprintr   now	isoformatscenario_introconversation_startersave_conversation)r   r   r   r   r$   existing_conversationconversation_datar   r   r   start_session   s4   



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 }t|	d
k}| |}||	 |||}|sZd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   r4   r   .0turnr   r   r   
<listcomp>R   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   r5   r   r   r   r8   W   s       r#   )r   r)   lenr   r+   r,   appendr   play_characterto_dictr/   )r   r$   r   r3   r   r   r1   r   learner_turnlearner_turnsis_first_learner_responseconversation_historyis_conclusion
ai_serviceai_responseai_turnr   r   r   add_learner_response?   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   r1   r   r   r   end_session}   s   zRoleplayEngine.end_sessionc                 C   s   | j ||}|sdS |d S )zGet full conversation historyNr(   )r   r)   rJ   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   r<   )r   r$   r   r1   r(   	turn_datar7   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)   getrJ   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(   rI   )r$   r%   r&   r'   
turn_countrI   )r   r)   rO   r;   rJ   r   r   r   get_session_info   s   

zRoleplayEngine.get_session_info)NN)F)T)__name__
__module____qualname__r   boolr   r   intstrr2   r   rG   rK   r   r   r   rL   r   rN   rP   rR   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    