
    Vi\,              	          d dl mZmZ d dlZd dlZd dlmZ d dlmZ d dl	m
Z
mZ d dlmZ dZefded	ed
edefdZd dlmZ  eddg          Ze                    d          dej        fd            Ze                    d          dej        fd            ZdefdZe                    d          defd            ZdS )    )	APIRouterHTTPExceptionN)
spi_schema)
spi_module)spi_questionsspi_scoring)logger   optionscorrect_answer	max_countreturnc           	        
 | rt          |           |k    r| S |s
| d|         S |r|d         nd}d}g }| D ]0}|r|d         nd}|r||k    r||}|                    |           1t          j        |t	          |dz
  t          |                              }t                      
|r
                    |           
                    |           
fd| D             }	|	S )u   
    선택지가 max_count개 초과이면, 정답을 반드시 포함한 채 max_count개로 축소.
    정답이 없는 문제(성격검사 등)는 그대로 반환.
    Nr      c                     g | ]}|v |	S  r   ).0opt
result_sets     /app/app/routers/spi_router.py
<listcomp>z trim_options.<locals>.<listcomp>/   s#    ;;;s
):):s):):):    )lenappendrandomsampleminsetaddupdate)r   r   r   correct_firstcorrect_opt
wrong_optsr   	opt_first
keep_wrongtrimmedr   s             @r   trim_optionsr'      s/   
  c'lli// #z	z"" *8AN1%%TMKJ # #!+CFFt	 	#Y-77K<OKKc"""" z3y1}c*oo+N+NOOJ J ${###j!!! <;;;g;;;GNr   )classify_and_save SPI)prefixtagsz/startrequestc           	        K   	 t          j        | j                   t          j                    }|st          dd          |d         }t          j        d| j                    |d         |d         |d         t          |d	         |	                    d
                    dt          |          dS # t          $ r:}t          j        d|            t          dt          |                    d}~ww xY w)u  
    SPI 시작 - 첫 번째 문제 반환
    
    Returns:
        - question_id: 문제 ID
        - question_type: 문제 유형
        - question_text: 문제 내용
        - options: 선택지
        - current: 현재 문제 번호
        - total: 전체 문제 수
      zNo questions availablestatus_codedetailr   zSPI Started for session: idtypetextr   r   r   question_idquestion_typequestion_textr   currenttotalzSPI Start Error: N)r   clear_session_logs
session_idr   get_all_questionsr   r	   infor'   getr   	Exceptionerrorstr)r-   all_questionsfirst_questiones       r   	start_spirG   8   s     <%g&8999 &799 	RC8PQQQQ 'q)D0BDDEEE *$/+F3+F3#N9$=~?Q?QRb?c?cdd''
 
 	
  < < <,,,---CFF;;;;<s   B1B6 6
C: 5C55C:z/answerc           
        K   	 t          j        | j                  }|st          dd          d}|d         dv r=|                    d          }|r|d         nd}| j        r| j        d         nd}||k    }t          j        | j        | j        | j        |	           t          j	        | j                  }t          t          j                              }t          j        d
| d| d| j                    ||k    rt          | j                   d{V }d|dS t          j                    }	|	|         }
d|
d         |
d         |
d         t          |
d         |
                    d                    |dz   |ddS # t           $ r:}t          j        d|            t          dt%          |                    d}~ww xY w)u   
    SPI 답변 제출
    
    Returns:
        - status: "continue" (계속) or "completed" (완료)
        - next_question: 다음 문제 (continue인 경우)
        - result: 최종 결과 (completed인 경우)
      zQuestion not foundr0   Nr4   )language	nonverbalr   r   )r=   r7   selected_option
is_correctzSPI Progress: /z for session 	completedstatusresultcontinuer3   r5   r   r   r6   )rQ   next_questionzSPI Answer Error: r/   )r   get_question_by_idr7   r   r@   rL   r   save_answerr=   get_answer_countr   r>   r	   r?   calculate_final_resultr'   rA   rB   rC   )r-   current_questionrM   r   correct_optionuser_optionanswered_counttotal_questionsrR   rD   rT   rF   s               r   
answer_spir^   b   s@     :<(;G<OPP 	NC8LMMMM 
F#'@@@-112BCCN 3AJ^A..dN8?8OY'1!44UYK%7J 	)+#3!		
 	
 	
 	
 $4W5GHHm=??@@h^hhohhT[Tfhhiii _,,1'2DEEEEEEEEF%    &799%n5 !,T2!.v!6!.v!6'i(@-BSBSTdBeBeff)A-( 

 

 
	
  < < <-!--...CFF;;;;<s   DF  A"F 
G5GGr=   c           	      v  K   	 t          j        | d          }t          d |D                       }t          j        |t          |                    \  }}t          j        | d          }t          d |D                       }t          j        |t          |                    \  }}t          j        | d          }	g }
|	D ]V}t          j        |d                   }|r8|
                    |d         |d         |	                    d          d	           Wt          j
        |
          }t          j        |          }t          j        |d
          }	 t          j        |||          }n0# t          $ r#}t!          j        d|            d}Y d}~nd}~ww xY wt          j        | ||||||           t'          | dd|           d{V  t          j        | |||||          }t!          j        d|             | |||||||dS # t          $ r}t!          j        d|            |d}~ww xY w)u   SPI 최종 결과 계산rJ   c              3   L   K   | ]}|                     d           dk    dV   dS rM   r   Nr@   r   as     r   	<genexpr>z)calculate_final_result.<locals>.<genexpr>   s9      WWQaeeL>Q>QUV>V>Vq>V>V>V>VWWr   rK   c              3   L   K   | ]}|                     d           dk    dV   dS ra   rb   rc   s     r   re   z)calculate_final_result.<locals>.<genexpr>   s9      YYal@S@SWX@X@X@X@X@X@XYYr   personalityr7   rL   trait)r7   rL   rh   F)ensure_asciiz!SPI AI Comment Generation Error: u   データを分析中です...N)r=   language_scorelanguage_gradenonverbal_scorenonverbal_gradepersonality_scorepersonality_typeAI)r=   partsenderr5   )r=   rj   rk   rl   rm   personality_scoreszSPI Completed for session: r=   rj   rk   rl   rm   rt   ro   summaryzSPI Result Calculation Error: )r   get_answers_by_typesumr   calculate_ability_grader   r   rU   r   r@   calculate_personality_scoresformat_personality_for_dbjsondumpsgenerate_ai_commentrA   r	   rB   save_or_update_outputr(   generate_professional_reportr?   )r=   language_answerslanguage_correctrj   rk   nonverbal_answersnonverbal_correctrl   rm   personality_answerspersonality_answers_with_traitanswerquestionpersonality_resultpersonality_for_dbpersonality_score_json
ai_commentrF   rv   s                      r   rX   rX      s     S%9*jQQWW*:WWWWW)4)LM]_bcs_t_t)u)u& '::{SSYY+<YYYYY+6+NO`befwbxbx+y+y( )<ZWW)+&) 	 	F$7}8MNNH .55#)-#8'-.?'@%\\'227 7    )EFdee(BCUVV!%,>U!S!S!S	:$8" JJ
  	: 	: 	:L@Q@@AAA9JJJJJJ	:
 	(!))++4'	
 	
 	
 	
  #	
 
 
 	
 	
 	
 	
 	
 	
 	
 :!))++1
 
 
 	>*>>??? %,,.."4 *	
 	
 		
    9a99:::sC   EH E0 /H 0
F:FH FA2H 
H8H33H8z/result/{session_id}c           
      2  K   	 t          j        |           }|st          dd          ddl}	  |j        |                    dd                    }n	#  i }Y nxY w| |                    dd          |                    d	d
          |                    dd          |                    dd
          ||                    dd          dd}d|dS # t          $ r:}t          j        d|            t          dt          |                    d}~ww xY w)uG   
    SPI 결과 조회
    
    Returns:
        SPI 최종 결과
    rI   z No result found for this sessionr0   r   Nrn   z{}rj   rk   Erl   rm   ro   r)   u   分析完了ru   successrP   zSPI Result Get Error: r/   )
r   
get_outputr   r|   loadsr@   rA   r	   rB   rC   )r=   outputr|   p_scoresrR   rF   s         r   get_spi_resultr     sU     <&z22 	\C8Z[[[[	!tz&**-@$"G"GHHHH	HHH %$jj)91==$jj)93??%zz*;Q??%zz*;SAA"* &

+=r B B%	
 	
  
 
 	

  < < <1a11222CFF;;;;<s/   +C $A C AA8C 
D5DD)fastapir   r   r|   r   app.schemasr   
app.modelsr   app.servicesr   r   app.core.configr	   MAX_OPTIONSlistrC   intr'   !app.services.goalskill_classifierr(   routerpostStartSPIRequestrG   AnswerSPIRequestr^   rX   r@   r   r   r   r   <module>r      s   - , , , , , , ,   " " " " " " ! ! ! ! ! ! 3 3 3 3 3 3 3 3 " " " " " " GR " "$ " " "VZ " " " "F @ ? ? ? ? ?	

 
 
 X&<Z7 &< &< &< &<R YC<j9 C< C< C< C<LUS U U U Up "##%<S %< %< %< $#%< %< %<r   