o
    hID                     @   s   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
mZmZmZ ddlmZmZmZ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 G dd deZG dd deZ G dd deZ!G dd deZ"G dd deZ#dS )    )APIView)Responsestatus)IsAuthenticated)AvgCountSumMaxQ   )CountryCategoryQuestionAnswerUserQuizPerformanceFeedback)QuestionAnswerSerializerCategorySerializerUserQuizPerformanceSerializerFeedbackSerializer)get_object_or_404)timezone)
CustomUserc                   @      e Zd Zdd ZdS )CategoryByCountryAPIViewc                 C   sl   |j d}|stdditjdS ddlm}m} t||d}|j	j
|d}t|d	d
}td|jitjdS )Ncountryerrorzcountry is requiredr   r   )r   r   id)r   Tmany
categories)query_paramsgetr   r   HTTP_400_BAD_REQUESTmodelsr   r   r   objectsfilterr   dataHTTP_200_OK)selfrequest
country_idr   r   r   r!   
serializer r.   (/var/www/spmcq_backend/app/user_views.pyr#      s   zCategoryByCountryAPIView.getN__name__
__module____qualname__r#   r.   r.   r.   r/   r          r   c                   @   r   )GetQuestionsAPIViewc                 C   s4  dd l }|jd}|jd}|jd}|r|r|s%tdditjdS tt|d}tt||d	}t	t
jj||d
|d}t	t
jj||d|d}	t	t
jj||d|d}
|| ||	 ||
 |d d }|	d d }|
d d }|| | }|stdg dtjdS t|dd}td|jdtjdS )Nr   r   categorylanguager   z+country, category and language are requiredr   r   )r   r   easy)r   r6   difficulty__iexactr7   mediumhard   zNo questions found)message	questionsTr   zQuestions fetched successfully)randomr"   r#   r   r   r$   r   r   r   listr   r&   r'   shuffler)   r   r(   )r*   r+   r?   r,   category_idr7   r   r6   easy_qs	medium_qshard_qseasy_samplemedium_samplehard_sampler>   r-   r.   r.   r/   r#       s,   


zGetQuestionsAPIView.getNr0   r.   r.   r.   r/   r5      r4   r5   c                   @      e Zd Zdd Zdd ZdS )UserQuizPerformanceAPIViewc                 C   s  z$|j d}|stdditjdW S z	tjj|d}W n tjy1   tdditjd Y W S w |j dd}|j d	d}d
}|dkrL|| d }|j dd}|dk rit	|}t
d|j d d|  tjj||j d|j d|j d|j d|j dd|j dd|||||j dd|j dd|j dg |j ddkrdnddd\}}	|	s|j d|_|j d|_|j dd|_|j dd|_||_||_||_||_|j dd|_|j dd|_|j dg |_t |_|j ddkr| jd7  _|  t|}
td|
j ||jdtjdW S  tyJ } zt
| tddt | itjdW  Y d }~S d }~ww )!z$Save or update user quiz performanceuser_idr   user_id is requiredr   emailUser not foundtotal_questionsr   correct_answers        d   time_taken_secondsz/Warning: Negative time_taken_seconds received: z, corrected to: r,   rB   country_namecategory_namereasonquitquestions_answeredcurrent_question_timecurrent_question_indexused_lifelines	completedr   )rU   rV   rW   rY   rP   rQ   average_scorerT   rZ   r[   r\   trophies)userr,   rB   defaultszPerformance saved successfully)r=   performancecalculated_scorer_   zFailed to save performance: N)!r(   r#   r   r   r$   r   r&   DoesNotExistHTTP_404_NOT_FOUNDabsprintr   get_or_createrU   rV   rW   rY   rP   rQ   r^   rT   rZ   r[   r\   r   nowquiz_attempted_atr_   update_best_performancer   r)   	Exceptionstr)r*   r+   
user_emailr`   rP   rQ   rc   rT   rb   createdr-   er.   r.   r/   post=   s   





zUserQuizPerformanceAPIView.postc              
   C   sz  z|j d}|stdditjdW S z	tjj|d}W n tjy0   tdditjd Y W S w t	jj
|ddd	d
 }t|dd}t	jj
|d}| }tdd |D }tdd |D }	|dkrj|	| nd}
| rytdd |D nd}tdd |D }td|j||t|
dt|d|ddtjdW S  ty } ztddt| itjdW  Y d	}~S d	}~ww )z:Get user's recent quiz performances and overall statisticsrK   r   rL   r   rM   rO   )r`   z-quiz_attempted_atNr<   Tr   c                 s       | ]}|j V  qd S N)total_attempts.0perfr.   r.   r/   	<genexpr>       z1UserQuizPerformanceAPIView.get.<locals>.<genexpr>c                 s   rr   rs   )r^   ru   r.   r.   r/   rx      ry   r   rR   c                 s   rr   rs   
best_scoreru   r.   r.   r/   rx      ry   c                 s   rr   rs   r_   ru   r.   r.   r/   rx      ry   z'Performance data retrieved successfully   )total_quizzes_attemptedtotal_questions_attemptedoverall_average_scorebest_score_overallr_   )r=   recent_quizzesoverall_statisticsz Failed to retrieve performance: )r"   r#   r   r   r$   r   r&   rd   re   r   r'   order_byr   countsumexistsmaxr(   roundr)   rl   rm   )r*   r+   rn   r`   recent_performancesrecent_serializerall_performancesr~   r   total_scorer   r   total_trophiesrp   r.   r.   r/   r#      sL   
zUserQuizPerformanceAPIView.getNr1   r2   r3   rq   r#   r.   r.   r.   r/   rJ   <   s    PrJ   c                   @   r   )LeaderboardAPIViewc                 C   s  z|j d}|stdditjdW S z	tjj|d}W n tjy1   tdditjd Y W S w t	j
ddd	d
jtdtdddd}t|}dd |D }|smtddd|jddddd|jdg dtjdW S g }|D ]%}t	jj|d d}tdd |D }	|	|d< |d pd|d< || qq|jdd d |}d }
d }t|D ]Z\}}|d |kr|d }
t	jj|d d}td!d |D }| rtd"d |D nd}|d }	|d |d
 |d pd#|d	 pd#|d$ |t|d pdd%t|d%|	d&	} nq|
d u r%t|d }
|j|j|jpd#|jpd#dddddd&	}g }t|d d' D ]X\}}t	jj|d d}td(d |D }| rStd)d |D nd}|d }	||d |d |d
 |d pjd#|d	 ppd#|d$ |t|d p{dd%t|d%|	d*
 q/td+|
t|||dtjdW S  ty } z#td,|  dd l }|!  tdd-t"| itjdW  Y d }~S d }~ww ).z3Get leaderboard with user position and top 10 usersrK   r   rL   r   rM   rO   user__emailuser__first_nameuser__last_nameuser__genderr   r^   )total_quizzesr   z-overall_average_scorez-total_quizzesc                 S   s   g | ]
}|d  dkr|qS )r   r   r.   )rv   statsr.   r.   r/   
<listcomp>       z*LeaderboardAPIView.get.<locals>.<listcomp>z#No users have attempted quizzes yetr   r   rR   )rN   r   r   r   r   r_   gender)r=   user_positiontotal_users
user_statstop_10_users)r   c                 s   rr   rs   r|   ru   r.   r.   r/   rx      ry   z)LeaderboardAPIView.get.<locals>.<genexpr>r_   r   c                 S   s   | d  | d  | d  fS )Nr_   r   r   r.   )xr.   r.   r/   <lambda>   r   z(LeaderboardAPIView.get.<locals>.<lambda>)keyNc                 s   rr   rs   rY   ru   r.   r.   r/   rx     ry   c                 s   rr   rs   rz   ru   r.   r.   r/   rx     ry    r   r}   )	rN   r   
first_name	last_namer   r   r   r   r_   
   c                 s   rr   rs   r   ru   r.   r.   r/   rx   %  ry   c                 s   rr   rs   rz   ru   r.   r.   r/   rx   &  ry   )
positionrN   r   r   r   r   r   r   r   r_   z'Leaderboard data retrieved successfullyzLeaderboard error: z Failed to retrieve leaderboard: )#r"   r#   r   r   r$   r   r&   rd   re   r   valuesannotater   r   r   r@   rN   r   r)   r'   r   appendsort	enumerater   r   r   lenr   r   rl   rg   	traceback	print_excrm   )r*   r+   rn   r`   r   user_stats_listuser_stats_list_with_trophiesr   user_performancesr   r   user_stats_datair   r   r   rp   r   r.   r.   r/   r#      s   	




 zLeaderboardAPIView.getNr0   r.   r.   r.   r/   r      r4   r   c                   @   rI   )ReportQuestionAPIViewc                 C   sF   t |jd}| r|  td|jdtjdS td|jitjdS )N)r(   zFeedback submitted successfully)r=   feedbackr   r   )	r   r(   is_validsaver   r   HTTP_201_CREATEDerrorsr$   )r*   r+   r-   r.   r.   r/   rq   G  s
   zReportQuestionAPIView.postc                 C   s,   t j }t|dd}td|jdtjdS )NTr   zFeedbacks fetched successfully)r=   	feedbacksr   )r   r&   allr   r   r(   r   r)   )r*   r+   r   r-   r.   r.   r/   r#   N  s   
zReportQuestionAPIView.getNr   r.   r.   r.   r/   r   F  s    r   N)$rest_framework.viewsr   rest_framework.responser   rest_frameworkr   rest_framework.permissionsr   django.db.modelsr   r   r	   r
   r   r%   r   r   r   r   r   serializersr   r   r   r   django.shortcutsr   django.utilsr   users.modelsr   r   r5   rJ   r   r   r.   r.   r.   r/   <module>   s"      