o
    1h$                     @   sF   d dl Z d dlZd dlmZmZmZmZ d dlmZ G dd dZ	dS )    N)DictListAnyOptional)Pathc                	   @   sx  e Zd Zd&defddZdefddZdd	 Zd
eee	f 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edeeee	f  fddZdedeee	f dede
fddZdededeeee	f  fddZdedede
fddZdedede
fddZdedede
fddZdeee	f dede
fdd Zdededeeee	f  fd!d"Zdedeeee	f  fd#d$Zd%S )'JSONHandlerstorage	base_pathc                 C   s   t || _|   d S )N)r   r	   _create_directories)selfr	    r   D/var/www/eduai.edurigo.com/roleplay/production/utils/json_handler.py__init__   s   
zJSONHandler.__init__is_adminc                 C   s2   |dkrdnd}| j | }|d |d |d dS )z$Get storage paths based on user type   adminlearner	scenariosconversationsassessments)r   r   r   )r	   )r   r   	user_type	user_pathr   r   r   _get_storage_paths   s   
zJSONHandler._get_storage_pathsc                 C   s4   dD ]}|  |}| D ]	}|jddd qqdS )z5Create storage directories for both admin and learner)r   r   T)parentsexist_okN)r   valuesmkdir)r   r   pathspathr   r   r   r
      s   
zJSONHandler._create_directoriesscenario_data
session_idreturnc           	   
   C   s   zKt d| dt| d | |}d| d}t d| d |d | }t|d	d
d}tj||ddd W d   W dS 1 sDw   Y  W dS  tye } zt d|  W Y d}~dS d}~ww )z+Save scenario to JSON file using session_idz-DEBUG JSONHandler.save_scenario: session_id='	' (type: )	scenario_.jsonz+DEBUG JSONHandler.save_scenario: filename=''r   wutf-8encoding   Findentensure_asciiNTzError saving scenario: )printtyper   openjsondump	Exception)	r   r   r   r    r   filenamefilepathfer   r   r   save_scenario   s"   

zJSONHandler.save_scenarioc              
   C      z8|  |}d| d}|d | }| sW dS t|ddd}t|W  d   W S 1 s1w   Y  W dS  tyR } ztd|  W Y d}~dS d}~ww )	z-Load scenario from JSON file using session_idr$   r%   r   Nrr(   r)   zError loading scenario: r   existsr1   r2   loadr4   r/   r   r    r   r   r5   r6   r7   r8   r   r   r   load_scenario/      
(zJSONHandler.load_scenarioc                 C   s   g }zF|  |}|d dD ]7}t|ddd&}t|}||d|jdd|d	 |d
 |d d W d   n1 sAw   Y  qW n t	ya } zt
d|  W Y d}~nd}~ww t|dd ddS )z*List all available scenarios for user typer   zscenario_*.jsonr;   r(   r)   r    r$    category	objective
created_at)r    rC   rD   rE   NzError listing scenarios: c                 S      | d S NrE   r   xr   r   r   <lambda>P       z,JSONHandler.list_scenarios.<locals>.<lambda>Tkeyreverse)r   globr1   r2   r>   appendgetstemreplacer4   r/   sorted)r   r   r   r   r6   r7   scenarior8   r   r   r   list_scenarios?   s(   


	zJSONHandler.list_scenariosconversation_datac           	   
   C   s   z]t d| dt| d | |}d| d}t d| d |d | }t d	| d t d
|  d t|ddd}tj||ddd W d   W dS 1 sVw   Y  W dS  tyw } zt d|  W Y d}~dS d}~ww )zSave conversation to JSON filez1DEBUG JSONHandler.save_conversation: session_id='r"   r#   conversation_r%   z/DEBUG JSONHandler.save_conversation: filename='r&   r   z4DEBUG JSONHandler.save_conversation: full_filepath='z4DEBUG JSONHandler.save_conversation: absolute_path='r'   r(   r)   r+   Fr,   NTzError saving conversation: )r/   r0   r   absoluter1   r2   r3   r4   )	r   r    rW   r   r   r5   r6   r7   r8   r   r   r   save_conversationR   s&   

zJSONHandler.save_conversationc              
   C   r:   )	z Load conversation from JSON filerX   r%   r   Nr;   r(   r)   zError loading conversation: r<   r?   r   r   r   load_conversationd   rA   zJSONHandler.load_conversationc              
   C      z-|  |}d| d}|d | }| r$|  td|  W dS td|  W dS  tyG } ztd|  W Y d	}~dS d	}~ww )
zDelete conversation filerX   r%   r   z"DEBUG: Conversation file deleted: Tz$DEBUG: Conversation file not found: FzError deleting conversation: Nr   r=   unlinkr/   r4   r   r    r   r   r5   r6   r8   r   r   r   delete_conversationt      
zJSONHandler.delete_conversationc              
   C   r\   )
zDelete scenario filer$   r%   r   zDEBUG: Scenario file deleted: Tz DEBUG: Scenario file not found: FzError deleting scenario: Nr]   r_   r   r   r   delete_scenario   ra   zJSONHandler.delete_scenarioc              
   C   r\   )
zDelete assessment fileassessment_r%   r   z DEBUG: Assessment file deleted: Tz"DEBUG: Assessment file not found: FzError deleting assessment: Nr]   r_   r   r   r   delete_assessment   ra   zJSONHandler.delete_assessmentassessment_datac              
   C   s   zTt d|d  d|  | |}d|d  d}t d| d |d | }t d	| d t|d
dd}tj||ddd W d   W dS 1 sMw   Y  W dS  tyn } zt d|  W Y d}~dS d}~ww )zSave assessment to JSON filez/DEBUG JSONHandler.save_assessment: session_id='r    z', is_admin=rc   r%   z-DEBUG JSONHandler.save_assessment: filename='r&   r   z-DEBUG JSONHandler.save_assessment: filepath='r'   r(   r)   r+   Fr,   NTzError saving assessment: )r/   r   r1   r2   r3   r4   )r   re   r   r   r5   r6   r7   r8   r   r   r   save_assessment   s$   

zJSONHandler.save_assessmentc              
   C   r:   )	zLoad assessment from JSON filerc   r%   r   Nr;   r(   r)   zError loading assessment: r<   r?   r   r   r   load_assessment   rA   zJSONHandler.load_assessmentc              
   C   s   g }zF|  |}|d dD ]7}t|ddd&}t|}||d |d|d |d |d	 |d
 d W d   n1 sAw   Y  qW n tya } ztd|  W Y d}~nd}~ww t	|dd ddS )z4List all assessments with summary info for user typer   zassessment_*.jsonr;   r(   r)   r    scenario_idoverall_scoreperformance_levelrE   )r    rh   ri   rj   rE   NzError listing assessments: c                 S   rF   rG   r   rH   r   r   r   rJ      rK   z.JSONHandler.list_assessments.<locals>.<lambda>TrL   )
r   rO   r1   r2   r>   rP   rQ   r4   r/   rT   )r   r   r   r   r6   r7   
assessmentr8   r   r   r   list_assessments   s*   



zJSONHandler.list_assessmentsN)r   )__name__
__module____qualname__strr   intr   r
   r   r   boolr9   r   r@   r   rV   rZ   r[   r`   rb   rd   rf   rg   rl   r   r   r   r   r      s    """"""r   )
r2   ostypingr   r   r   r   pathlibr   r   r   r   r   r   <module>   s
    