
    Oiq,              	          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_savez/goal-skill-t/api/spi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_spirF   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 foundr/   Nr3   )language	nonverbalr   r   )r<   r6   selected_option
is_correctzSPI Progress: /z for session 	completedstatusresultcontinuer2   r4   r   r   r5   )rP   next_questionzSPI Answer Error: r.   )r   get_question_by_idr6   r   r?   rK   r   save_answerr<   get_answer_countr   r=   r	   r>   calculate_final_resultr'   r@   rA   rB   )r,   current_questionrL   r   correct_optionuser_optionanswered_counttotal_questionsrQ   rC   rS   rE   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 최종 결과 계산rI   c              3   L   K   | ]}|                     d           dk    dV   dS rL   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   rJ   c              3   L   K   | ]}|                     d           dk    dV   dS r`   ra   rb   s     r   rd   z)calculate_final_result.<locals>.<genexpr>   s9      YYal@S@SWX@X@X@X@X@X@XYYr   personalityr6   rK   trait)r6   rK   rg   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senderr4   )r<   ri   rj   rk   rl   personality_scoreszSPI Completed for session: r<   ri   rj   rk   rl   rs   rn   summaryzSPI Result Calculation Error: )r   get_answers_by_typesumr   calculate_ability_grader   r   rT   r   r?   calculate_personality_scoresformat_personality_for_dbjsondumpsgenerate_ai_commentr@   r	   rA   save_or_update_outputr(   generate_professional_reportr>   )r<   language_answerslanguage_correctri   rj   nonverbal_answersnonverbal_correctrk   rl   personality_answerspersonality_answers_with_traitanswerquestionpersonality_resultpersonality_for_dbpersonality_score_json
ai_commentrE   ru   s                      r   rW   rW      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 최종 결과
    rH   z No result found for this sessionr/   r   Nrm   z{}ri   rj   Erk   rl   rn    u   分析完了rt   successrO   zSPI Result Get Error: r.   )
r   
get_outputr   r{   loadsr?   r@   r	   rA   rB   )r<   outputr{   p_scoresrQ   rE   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listrB   intr'   !app.services.goalskill_classifierr(   routerpostStartSPIRequestrF   AnswerSPIRequestr]   rW   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   