
    Vi0                     l   d dl mZmZ d dlmZ d dlmZmZ d dlm	Z	m
Z
mZmZ d dlmZ d dlmZ d dlmZmZ  edd	g
          ZdZdZdedefdZe                    d          defd            Ze                    d          defd            Ze                    d          defd            ZdS )    )	APIRouterHTTPException)	it_module)StartITRequestAnswerITRequest)get_it_questionsget_question_by_idget_questions_by_levelget_level_name)calculate_final_result)classify_and_save)ListDict IT)prefixtags   
   optionsreturnc                 B    g dfdt          |           D             S )u3   選択肢を A, B, C, D 形式にフォーマットABCDEc                 V    g | ]%\  }}|t                    k     |          d | &S ) )len).0ioptletterss      /app/app/routers/it_router.py
<listcomp>z#_format_options.<locals>.<listcomp>   s?    WWWfaa#g,,FVFVwqz!!C!!FVFVFV    )	enumerate)r   r%   s    @r&   _format_optionsr*      s0    '''GWWWW	'0B0BWWWWr(   z/startrequestc           
        K   	 t          j        | j                   t          d          }|st	          dd          |d         }t
          }|d         |d         t          |d                   d|dt          d          dt
          d		S # t          $ r  t          $ r#}t	          dt          |                    d
}~ww xY w)u[   
    Python レベルテスト開始 — 初級(レベル1)の最初の問題を返す
         zNo questions found for level 1status_codedetailr   idquestionr   	question_idquestion_textr   currenttotalcurrent_levelcurrent_level_namequestion_in_levelquestions_per_levelN)
r   clear_session_logs
session_idr
   r   QUESTIONS_PER_LEVELr*   r   	Exceptionstr)r+   level_questionsfirst_qtotal_questionses        r&   start_it_testrF      s      
<$W%7888033 	ZC8XYYYY!!$- #4=$Z0&wy'9::$"0"3"3!"#6

 

 
	
     < < <CFF;;;;<s   BB CB==Cz/answerc                 	  K   	 t          | j                  }|st          dd| j         d          |d         }	 |d                             |d                   }g d}||         }n# t          $ r d	}Y nw xY wd
}| j        rdd	l}|                    d| j                                        |j	                  }|r(|
                    d                                          }n| j        d                                         }|d	uo||k    }	| j        }
d|
v r|
                    dd          d         }
t          j        | j        | j        |
|	           t!          |          }d |D                                 | j                  }|t"          dz
  k     rpt          j        | j                  }||dz            }d|	|d         |d         t'          |d                   |dz   t"          |t)          |          |dz   t"          d	dS t          j        | j                  }fd|D             }t-          d |D                       }d |D             }g }|D ]Y}t          |d                   }|r@|                    |d         |d         |d         |                    dd
          d           Z|t"          k    r|t2          k    rt5          | j        d|t"          g           }t          j        | j        |d          |d         |d!         "           d#|d!          }t9          | j        d$d%|&           d	{V  d'|	|t)          |          |d(S |dz   }t!          |          }|st          d)d*|           |d         }d|	|t)          |          |d         |d         t'          |d                   dt"          |t)          |          dt"          d	d+S t;          d|dz
            }t5          | j        ||t"          ||,          }t          j        | j        |d          |d         |d!         "           t)          |          }d-| d.| d/t"           d0|d          d1|d!          
}t9          | j        d$d%|&           d	{V  d'|	|t"          ||||d2S # t          $ r  t<          $ r#}t          d)t?          |                    d	}~ww xY w)3u[  
    Python レベルテスト回答処理

    ロジック:
    - 正解/不正解に関係なく、同じレベルの次の問題へ進む (強制終了なし)
    - レベルの10問をすべて回答した後:
      - 全問正解 → 次のレベルへ (上級クリアなら完了)
      - 1問でも不正解 → 結果パネル表示
    i  z	Question z
 not foundr/   levelr   answerr   Nr   r   z
^([A-E])\br-   r    )r>   r5   selected_answer
is_correctc                     g | ]
}|d          S )r2    )r"   qs     r&   r'   z"answer_it_test.<locals>.<listcomp>u   s    ???!ag???r(   continuer2   r3      r4   )statusrK   next_questionc                 (    g | ]}|d          v |S )r5   rM   )r"   alevel_question_idss     r&   r'   z"answer_it_test.<locals>.<listcomp>   s)    ZZZq1]3CGY3Y3Y3Y3Y3Yr(   c              3   *   K   | ]}|d          
dV  dS rK   r-   NrM   r"   rT   s     r&   	<genexpr>z!answer_it_test.<locals>.<genexpr>   s+      HH!,HAHHHHHHr(   c                 "    g | ]}|d          
|S rK   rM   rX   s     r&   r'   z"answer_it_test.<locals>.<listcomp>   s!    IIIq<IIIIr(   r5   rJ   reasonr3   correct_answeruser_answerr\   r   )assigned_levelcorrect_counttotal_in_levelwrong_detailstotal_scoremessage)r>   rd   rH   descriptionuC   Pythonレベルテスト: 全レベルクリア → 上級付与 - Ir   )r>   senderparttext	completed)rQ   rK   level_clearedlevel_cleared_nameresultr.   zNo questions for level )rQ   rK   rl   rm   rR   )r`   ra   rb   rc   failed_at_levelu   Pythonレベルテスト: u   で/u   問正解 → u	   付与 - )rQ   rK   ra   rb   ro   failed_at_level_namerc   rn   ) r	   r5   r   index
ValueErrorrJ   researchstrip
IGNORECASEgroupuppersplitr   save_answerr>   r
   r?   get_answer_countr*   r   get_all_answerssumappendget	MAX_LEVELr   save_or_update_outputr   maxr@   rA   )r+   current_questionr9   correct_idxr%   correct_letteruser_letterrt   matchrK   selected_answer_cleanrB   current_index_in_levelanswer_countnext_qall_answerslevel_answersra   wrong_answersrc   warN   rn   result_text
next_levelnext_level_questionsr`   failed_level_namerE   rU   s                                @r&   answer_it_testr   <   s     L<-g.ABB 	eC8cGDW8c8c8cdddd(1
	"*95;;<LX<VWWK///G$[1NN 	" 	" 	"!NNN	" " 	AIIIIImW-D-J-J-L-Lbm\\E A#kk!nn2244%5a8>>@@$D0R[N5R
 !( 7'''$9$?$?Q$G$G$J! 	)+1!		
 	
 	
 	
 1???????!3!9!9':M!N!N
 "$7!$;;;$5g6HIIL$%;a%?@F$(#)$<%+J%7.vi/@AA590%2*8*G*G)?!)C+>
" 
"  (  /0BCCZZZZKZZZHH}HHHHHIIMIII  	 	B"2m#455A $$ !*&'k#%&7#8eeHb11	& &    ///	)) 0&#$"/#6"$   /&1 &} 5 / &y 1	    xdjktduww'&1$	          *",%2*8*G*G$   +Q.
'=j'I'I$+ h'C@fZd@f@fgggg-a0(",%2*8*G*G'-d|)/
);#26)3D#E#E#$!4)3.<Z.H.H-./B
& 
&  , Q 122')'.')
 
 
 	')}-/y)		
 	
 	
 	
 +=99 j3D  j  j  j  jYl  j  j  }C  DK  }L  j  j  W]  ^g  Wh  j  j)	
 
 
 	
 	
 	
 	
 	
 	
 	
 "$*1,$5*	
 	
 		
     < < <CFF;;;;<sP   8R  -A, +R  ,A;8R  :A;;FR  ER  BR   B?R   S4SSz/result/{session_id}r>   c           
        K   	 t          j        |           }|st          dd          t          j        |           }d |D             }g }|D ]Y}t	          |d                   }|r@|                    |d         |d         |d         |                    d	d
          d           Z|                    dd          |                    dd          |                    dd
          dt          d |D                       |d}d|dS # t          $ r@}t          
                    d|            t          dt          |                    d}~ww xY w)u   
    IT 결과 조회
    i  zNo result foundr/   c                 <    g | ]}|                     d           |S r[   r   rX   s     r&   r'   z!get_it_result.<locals>.<listcomp>   s)    KKKqquu\7J7JKKKKr(   r5   r3   rI   rJ   r\   r   r]   rd   r   rH   u   入門rf      c              3   D   K   | ]}|                     d           dV  dS rW   r   rX   s     r&   rY   z get_it_result.<locals>.<genexpr>1  s3       O Oq155;N;N O O O O O O Or(   )rd   rH   re   rD   ra   rc   success)rQ   rn   zIT Result Get Error: r.   N)r   
get_outputr   r}   r	   r   r   r~   r@   loggererrorrA   )	r>   outputr   r   rc   r   rN   rn   rE   s	            r&   get_it_resultr     s     
!<%j11 	L S9JKKKK/
;;KKKKKK 	 	B"2m#455A $$ !*&'k#%&7#8eeHb11	& &    "::mQ77ZZ22zz-44!  O OK O O OOO*
 
  
 
 	
  < < <0Q00111CFF;;;;<s   DD
 

E;EEN)fastapir   r   
app.modelsr   app.schemas.it_schemar   r   app.services.it_questionsr   r	   r
   r   app.services.it_scoringr   !app.services.goalskill_classifierr   typingr   r   routerr   r?   listr*   postrF   r   r   rA   r   rM   r(   r&   <module>r      s   - , , , , , , ,             A A A A A A A A r r r r r r r r r r r r : : : : : : ? ? ? ? ? ?        	

 
 

 	 XT Xd X X X X X< < < < <B YV</ V< V< V< V<p "##%<C %< %< %< $#%< %< %<r(   