o
    ip!                     @   s   d dl mZm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 eddgd	Zed
dejfddZeddejfddZdefddZeddefddZdS )    )	APIRouterHTTPExceptionN)
spi_schema)
spi_module)spi_questionsspi_scoring)loggerz/goal-skill-t/api/spiSPI)prefixtagsz/startrequestc              
      s   z3t | j t }|stddd|d }td| j  |d |d |d |d	 d
t|dW S  t	yP } zt
d|  tdt|dd}~w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textoptions   question_idquestion_typequestion_textr   currenttotalzSPI Start Error: N)r   clear_session_logs
session_idr   get_all_questionsr   r   infolen	Exceptionerrorstr)r   all_questionsfirst_questione r'   8/home/air/goalskill_sales/back/app/routers/spi_router.py	start_spi   s(   	r)   z/answerc              
      sN  zt | j}|stdddd}|d dv r3|d}|r#|d nd}| jr-| jd nd}||k}tj| j| j| j|d	 t	| j}t
t  }td
| d| d| j  ||krlt| jI dH }d|dW S t  }	|	| }
d|
d |
d |
d |
d |d |ddW S  ty } ztd|  tdt|dd}~ww )u   
    SPI 답변 제출
    
    Returns:
        - status: "continue" (계속) or "completed" (완료)
        - next_question: 다음 문제 (continue인 경우)
        - result: 최종 결과 (completed인 경우)
      zQuestion not foundr   Nr   )language	nonverbalcorrect_answerr   )r   r   selected_option
is_correctzSPI Progress: /z for session 	completed)statusresultcontinuer   r   r   r   r   )r2   next_questionzSPI Answer Error: r   )r   get_question_by_idr   r   getr.   r   save_answerr   get_answer_countr    r   r   r   calculate_final_resultr!   r"   r#   )r   current_questionr/   r-   correct_optionuser_optionanswered_counttotal_questionsr3   r$   r5   r&   r'   r'   r(   
answer_spi:   sR   

r@   r   c              
      s  zt | d}tdd |D }t|t|\}}t | d}tdd |D }t|t|\}}t | d}	g }
|	D ]}t|d }|rY|
|d |d |	d	d
 q>t
|
}|	dd}z	t|||}W n ty } ztd|  d}W Y d}~nd}~ww t j| ||||||d tj| |||||d}td|   | |||||d|dW S  ty } z
td|  |d}~ww )u   SPI 최종 결과 계산r+   c                 s   "    | ]}| d dkrdV  qdS r/   r   Nr7   .0ar'   r'   r(   	<genexpr>        z)calculate_final_result.<locals>.<genexpr>r,   c                 s   rA   rB   rC   rD   r'   r'   r(   rG      rH   personalityr   r.   trait)r   r.   rJ   total_scorer   z!SPI AI Comment Generation Error: u   データを分析中です...N)r   language_scorelanguage_gradenonverbal_scorenonverbal_gradepersonality_scorepersonality_type)r   rL   rM   rN   rO   personality_scoreszSPI Completed for session: zAnalysis Completed)r   rL   rM   rN   rO   rR   rQ   summaryzSPI Result Calculation Error: )r   get_answers_by_typesumr   calculate_ability_grader    r   r6   appendr7   calculate_personality_scoresgenerate_ai_commentr!   r   r"   save_or_update_outputgenerate_professional_reportr   )r   language_answerslanguage_correctrL   rM   nonverbal_answersnonverbal_correctrN   rO   personality_answerspersonality_answers_with_traitanswerquestionpersonality_resultpersonality_total_score
ai_commentr&   rS   r'   r'   r(   r:      s   
	r:   z/result/{session_id}c              
      s\   zt | }|stddd|W S  ty- } ztd|  tdt|dd}~ww )uG   
    SPI 결과 조회
    
    Returns:
        SPI 최종 결과
    r*   z No result found for this sessionr   zSPI Result Get Error: r   N)r   
get_outputr   r!   r   r"   r#   )r   r3   r&   r'   r'   r(   get_spi_result   s   
rh   )fastapir   r   jsonapp.schemasr   
app.modelsr   app.servicesr   r   app.core.configr   routerpostStartSPIRequestr)   AnswerSPIRequestr@   r#   r:   r7   rh   r'   r'   r'   r(   <module>   s"   )FP