
    Ci                         d Z ddlZddlmZmZmZ ddlmZ ddlm	Z	 ddl
mZ ddlmZ ddlmZ dd	lmZmZ dd
lmZ ddlmZmZ  G d d      Z ee      fdedefdZy)uM   
Logique métier pour la gestion des quiz flexibles (génération, notation)
    N)ListAnyDict)Depends)func)Session)get_db)QuizCategory)CategoryQuestionCategoryQuestionType)FlexibleAttempt)QuizSubmission
UserAnswerc                   j    e Zd ZdefdZdededefdZdedee	   fdZ
ded	edefd
Zde	dedefdZy)FlexibleQuizServicedbc                     || _         y )Nr   )selfr   s     J/home/www/lebenam.kofcorporation.com/app/services/flexible_quiz_service.py__init__zFlexibleQuizService.__init__   s	        category_iduser_idreturnc                 $   | j                   j                  t              j                  t        j                  |k(  t        j
                  dk(        j                         }|st        d      | j                   j                  t              j                  t        j                  |k(  t        j
                  dk(        j                         }|st        d      t        |j                  t        |            }t        j                  ||      }|D cg c]  }|j                  dd }}t!        |||ddd      }	| j                   j#                  |	       | j                   j%                          | j                   j'                  |	       |	S c c}w )u   
        Démarre un quiz pour une catégorie donnée, crée une tentative et sélectionne les questions aléatoirement.
        Tu+   Catégorie de quiz non trouvée ou inactiveu?   Aucune question active disponible pour cette catégorie de quizN)question_idanswer_data)r   r   answersscorepassedcompleted_at)r   queryr
   filterid	is_activefirst
ValueErrorr   r   allminnumber_of_questionslenrandomsampler   addcommitrefresh)
r   r   r   categoryactive_questionsnum_questionsselected_questionsqinitial_answersattempts
             r   
start_quizzFlexibleQuizService.start_quiz   sZ    77==.55OO{*""d*
 %' 	
 JKK  77==)9:AA((K7&&$.
 #% 	
  ^__H88#>N:OP#]]+;]K AS
;<ADD6
 

 "##
 	G #
s   Fr8   c                 p   |j                   D cg c]  }|d   	 }}| j                  j                  t              j	                  t        j
                  j                  |            j                         }|D ci c]  }|j
                  | }}|D cg c]  }||v s||    }}|S c c}w c c}w c c}w )uM   Récupère les objets Question basés sur les IDs stockés dans la tentative.r   )r   r   r#   r   r$   r%   in_r)   )	r   r8   aquestion_ids	questionsr6   question_mapqidordered_questionss	            r   get_questions_for_attemptz-FlexibleQuizService.get_questions_for_attempt@   s    29//BQ-(BBGGMM"23::##L1

#% 	
 *33Aa33:F^3#Q]J]\#.^^   C 4^s   B):B.	B3B3
submissionc                    |j                   rt        d      |j                  }| j                  |      }|D ci c]  }|j                  | }}t        |      }d}g }	|j                  D 
ci c]  }
|
j                  |
j                   }}
|j                  D ]P  }|d   }|j                  |      }||vr||   }| j                  ||      }|r|dz  }|	j                  |||d       R |dkD  rt        ||z  dz        nd}||j                  k\  }|	|_        ||_        ||_        t!        j"                         |_         | j$                  j'                          | j$                  j)                  |       |S c c}w c c}
w )uU   
        Soumet les réponses, calcule le score et met à jour la tentative.
        u   Ce quiz a déjà été soumis.r   r      )r   r   
is_correctd   )r"   r(   r2   rB   r%   r,   r   r   r   get_check_answerappendintpassing_scorer    r!   r   nowr   r0   r1   )r   r8   rC   r2   r>   r6   r?   total_questionscorrect_answers_countupdated_answersr<   submission_mapanswer_entryr   user_answer_dataquestionrF   r    r!   s                      r   submit_quizzFlexibleQuizService.submit_quizM   s    =>>##227;	)23Aa33i. ! @J@R@RS1!--6SS#OO 	L&}5K-11+>,.#K0H++H6FGJ%*%""*/($ 	( IXZ[H[*_<CDab(000 *#xxz S 4 Ts   E7,E<rT   rS   c                    |j                   }|y|j                  }|t        j                  k(  r&t	        |      t	        |j                  d            k(  S |t        j                  k(  rYt        |D cg c]  }t	        |       c}      }t        |j                  dg       D cg c]  }t	        |       c}      }||k(  S |t        j                  k(  rct	        |      j                         j                         }t	        |j                  dd            j                         j                         }	||	k(  S |t        j                  k(  r*t	        |      }
t	        |j                  d            }|
|k(  S yc c}w c c}w )uG   Logique de vérification de la réponse basée sur le type de question.Fanswerr   text date)correct_answer_dataquestion_typer   SINGLE_CHOICEstrrH   MULTIPLE_CHOICEsortedTEXTstriplowerDATE)r   rT   rS   correct_dataq_typer<   user_answerscorrect_answers	user_textcorrect_text	user_datecorrect_dates               r   rI   z!FlexibleQuizService._check_answer   sR   33#'')777'(C0@0@0J,KKK+;;;!3C"Da3q6"DEL$l6F6FyRT6U%Vc!f%VWO?22+000,-335;;=I|//;<BBDJJLL,,+000,-I|//78L,,! #E%Vs   1E5#E:N)__name__
__module____qualname__r   r   rK   r   r9   r   r   rB   r   rU   r   boolrI    r   r   r   r      sz    7 *c *C *O *X! !TJZE[ !2? 2 2Sb 2h&6 # RV r   r   r   r   c                     t        |       S )u-   Dépendance pour le service de quiz flexible.)r   r   s    r   get_flexible_quiz_servicers      s    r""r   )__doc__r-   typingr   r   r   fastapir   
sqlalchemyr   sqlalchemy.ormr   app.db.sessionr	   app.models.flexible_quizr
   app.models.flexible_questionr   r   app.models.flexible_attemptr   app.schemas.flexible_quizr   r   r   rs   rq   r   r   <module>r~      sW     " "   " ! 1 O 7 @P Pd -4FO #' #@S #r   