
    `i|i*'                     L    S SK r S SKrS SKJrJrJrJr  S SKJr   " S S5      r	g)    N)DictListAnyOptional)Pathc            	          \ rS rSrSS\4S jjrS\4S jrS rS\	\\
4   S\S\S	\4S
 jrS\S\S	\\	\\
4      4S jrS\S	\\	\\
4      4S jrS\S\	\\
4   S\S	\4S jrS\S\S	\\	\\
4      4S jrS\S\S	\4S jrS\S\S	\4S jrS\S\S	\	\\4   4S jrS\S\S	\4S jrS\	\\
4   S\S	\4S jrS\S\S	\\	\\
4      4S jrS\S	\\	\\
4      4S jrSrg)JSONHandler   	base_pathc                 D    [        U5      U l        U R                  5         g )N)r   r   _create_directories)selfr   s     D/var/www/eduai.edurigo.com/roleplay/production/utils/json_handler.py__init__JSONHandler.__init__   s    i 	  "    is_adminc                 R    US:X  a  SOSnU R                   U-  nUS-  US-  US-  S.$ )z$Get storage paths based on user type   adminlearner	scenariosconversationsassessments)r   r   r   r   )r   r   	user_type	user_paths       r   _get_storage_pathsJSONHandler._get_storage_paths   sA    '1}G)	NNY.	 #[0&8$}4
 	
r   c                     S H;  nU R                  U5      nUR                  5        H  nUR                  SSS9  M     M=     g)z5Create storage directories for both admin and learner)r   r   T)parentsexist_okN)r   valuesmkdir)r   r   pathspaths       r   r   JSONHandler._create_directories   s<    H++H5E

4$
7 ' r   scenario_data
session_idreturnc                 X    [        SU S[        U5       S35        U R                  U5      nSU S3n[        SU S35        US   U-  n[        US	S
S9 n[        R
                  " XSSS9  SSS5        g! , (       d  f       g= f! [         a  n[        SU 35         SnAgSnAff = f)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es	            r   save_scenarioJSONHandler.save_scenario   s    	A*YW[\fWgVhhijk++H5E":,e4H?zKL[)H4Hhg6!		-15I 7 76 	+A3/0	s6   AB A6-B 6
B B B 
B)B$$B)c                 0    U R                  U5      nSU S3nUS   U-  nUR                  5       (       d  g[        USSS9 n[        R                  " U5      sSSS5        $ ! , (       d  f       g= f! [
         a  n[        SU 35         SnAgSnAff = f)	z-Load scenario from JSON file using session_idr.   r/   r   Nrr2   r3   zError loading scenario: r   existsr;   r<   loadr>   r9   r   r)   r   r%   r?   r@   rA   rB   s           r   load_scenarioJSONHandler.load_scenario/   s    	++H5E":,e4H[)H4H??$$hg6!yy| 766 	,QC01	:   4A3 A3 A"	A3 "
A0,A3 0A3 3
B=BBc                    / n U R                  U5      nUS   R                  S5       Hv  n[        USSS9 n[        R                  " U5      nUR                  UR                  SUR                  R                  SS5      5      US	   US
   US   S.5        SSS5        Mx     [        US SS9$ ! , (       d  f       M  = f! [         a  n[        SU 35         SnAN;SnAff = f)z*List all available scenarios for user typer   zscenario_*.jsonrF   r2   r3   r)   r.    category	objective
created_at)r)   rP   rQ   rR   NzError listing scenarios: c                     U S   $ NrR    xs    r   <lambda>,JSONHandler.list_scenarios.<locals>.<lambda>P   s    qr   Tkeyreverse)r   globr;   r<   rI   appendgetstemreplacer>   r9   sorted)r   r   r   r%   r@   rA   scenariorB   s           r   list_scenariosJSONHandler.list_scenarios?   s    		3++H5E!+.334EF(C':a#yy|H$$&.ll<AVAVWbdfAg&h$,Z$8%-k%:&.|&<	&  ;: G i%>MM ;:  	3-aS122	3s/   3C A B/C /
B>	9C 
C#CC#conversation_datac                     [        SU S[        U5       S35        U R                  U5      nSU S3n[        SU S35        US   U-  n[        S	U S35        [        S
UR                  5        S35        [	        USSS9 n[
        R                  " X'SSS9  SSS5        g! , (       d  f       g= f! [         a  n[        SU 35         SnAgSnAff = f)zSave conversation to JSON filez1DEBUG JSONHandler.save_conversation: session_id='r,   r-   conversation_r/   z/DEBUG JSONHandler.save_conversation: filename='r0   r   z4DEBUG JSONHandler.save_conversation: full_filepath='z4DEBUG JSONHandler.save_conversation: absolute_path='r1   r2   r3   r5   Fr6   NTzError saving conversation: )r9   r:   r   absoluter;   r<   r=   r>   )	r   r)   rf   r   r%   r?   r@   rA   rB   s	            r   save_conversationJSONHandler.save_conversationR   s    	Ej\QZ[_`j[kZllmno++H5E&zl%8HCH:QOP_-8HH
RSTUHIZIZI\H]]^_`hg6!		+quM 7 76 	/s34	s6   B B3 B"B3 "
B0,B3 0B3 3
C=CCc                 0    U R                  U5      nSU S3nUS   U-  nUR                  5       (       d  g[        USSS9 n[        R                  " U5      sSSS5        $ ! , (       d  f       g= f! [
         a  n[        SU 35         SnAgSnAff = f)	z Load conversation from JSON filerh   r/   r   NrF   r2   r3   zError loading conversation: rG   rJ   s           r   load_conversationJSONHandler.load_conversationd   s    	++H5E&zl%8H_-8H??$$hg6!yy| 766 	045	rM   c                     U R                  U5      nSU S3nUS   U-  nUR                  5       (       a  UR                  5         [        SU 35        g[        SU 35        g! [         a  n[        SU 35         S	nAgS	nAff = f)
zDelete conversation filerh   r/   r   z"DEBUG: Conversation file deleted: Tz$DEBUG: Conversation file not found: FzError deleting conversation: Nr   rH   unlinkr9   r>   r   r)   r   r%   r?   r@   rB   s          r   delete_conversationJSONHandler.delete_conversationt   s    	++H5E&zl%8H_-8H  !:8*EF<XJGH 	1!56	   AA$ A$ $
B.BBc                     U R                  U5      nSU S3nUS   U-  nUR                  5       (       a  UR                  5         [        SU 35        g[        SU 35        g! [         a  n[        SU 35         S	nAgS	nAff = f)
zDelete scenario filer.   r/   r   zDEBUG: Scenario file deleted: Tz DEBUG: Scenario file not found: FzError deleting scenario: Nrp   rr   s          r   delete_scenarioJSONHandler.delete_scenario   s    	++H5E":,e4H[)H4H  !6xjAB8
CD 	-aS12	ru   c                     U R                  X5      U R                  X5      U R                  X5      S.n[        SU SU 35        U$ )zu
Professionally cleans up all files associated with a session.
Deletes scenario, conversation, and assessment files.
)scenario_deletedconversation_deletedassessment_deletedzDEBUG: Session z cleanup status: )rw   rs   delete_assessmentr9   )r   r)   r   resultss       r   cleanup_sessionJSONHandler.cleanup_session   sR     !% 4 4Z J$($<$<Z$R"&"8"8"N

 	
|+<WIFGr   c                     U R                  U5      nSU S3nUS   U-  nUR                  5       (       a  UR                  5         [        SU 35        g[        SU 35        g! [         a  n[        SU 35         S	nAgS	nAff = f)
zDelete assessment fileassessment_r/   r   z DEBUG: Assessment file deleted: Tz"DEBUG: Assessment file not found: FzError deleting assessment: Nrp   rr   s          r   r}   JSONHandler.delete_assessment   s    	++H5E$ZL6H]+h6H  !8
CD:8*EF 	/s34	ru   assessment_datac                 n    [        SUS    SU 35        U R                  U5      nSUS    S3n[        SU S35        US   U-  n[        S	U S35        [        US
SS9 n[        R                  " XSSS9  SSS5        g! , (       d  f       g= f! [
         a  n[        SU 35         SnAgSnAff = f)zSave assessment to JSON filez/DEBUG JSONHandler.save_assessment: session_id='r)   z', is_admin=r   r/   z-DEBUG JSONHandler.save_assessment: filename='r0   r   z-DEBUG JSONHandler.save_assessment: filepath='r1   r2   r3   r5   Fr6   NTzError saving assessment: )r9   r   r;   r<   r=   r>   )r   r   r   r%   r?   r@   rA   rB   s           r   save_assessmentJSONHandler.save_assessment   s    	COT`DaCbbnownxyz++H5E$_\%B$C5IHA(1MN]+h6HA(1MNhg6!		/QUK 7 76 	-aS12	s6   AB !B8B 
BB B 
B4B//B4c                 0    U R                  U5      nSU S3nUS   U-  nUR                  5       (       d  g[        USSS9 n[        R                  " U5      sSSS5        $ ! , (       d  f       g= f! [
         a  n[        SU 35         SnAgSnAff = f)	zLoad assessment from JSON filer   r/   r   NrF   r2   r3   zError loading assessment: rG   rJ   s           r   load_assessmentJSONHandler.load_assessment   s    	++H5E$ZL6H]+h6H??$$hg6!yy| 766 	.qc23	rM   c           
         / n U R                  U5      nUS   R                  S5       Hc  n[        USSS9 n[        R                  " U5      nUR                  US   UR                  SUS   5      US   US	   US
   S.5        SSS5        Me     [        US SS9$ ! , (       d  f       M  = f! [         a  n[        SU 35         SnAN;SnAff = f)z4List all assessments with summary info for user typer   zassessment_*.jsonrF   r2   r3   r)   scenario_idoverall_scoreperformance_levelrR   )r)   r   r   r   rR   NzError listing assessments: c                     U S   $ rT   rU   rV   s    r   rX   .JSONHandler.list_assessments.<locals>.<lambda>   s    <r   TrZ   )
r   r]   r;   r<   rI   r^   r_   r>   r9   rb   )r   r   r   r%   r@   rA   
assessmentrB   s           r   list_assessmentsJSONHandler.list_assessments   s    	5++H5E!-0556IJ(C':a!%1J&&&0&>'1~~mZP\E]'^)3O)D-78K-L&0&>(  ;: K k'@$OO ;:  	5/s344	5s/   3B. ABB. 
B+	&B. .
C8CCr   N)storage)__name__
__module____qualname____firstlineno__strr   intr   r   r   r   boolrC   r   rK   r   rd   rj   rm   rs   rw   r   r}   r   r   r   __static_attributes__rU   r   r   r	   r	      s   ## #	
3 	
84S> S VY ^b   s xSRUX?W  Ns NtDcN/C N&C DcN ^a fj $C 3 8DQTVYQYNC[  c S T $#   $#  c4i C 3 4 $tCH~  QU "#  $sTWx.AY  P Pd38n1E Pr   r	   )
r<   ostypingr   r   r   r   pathlibr   r	   rU   r   r   <module>r      s"     	 , , dP dPr   