from django.db.models import Avg

from BasicData.models import Annee, Ecue, Etudiant, MoyenneEcue, MoyenneUe, Note


def calcul(etudiant, ecue, session):
    """
    La focntion calcul permet de calcluer la moyenne d'un etudiant.
    Elle prend en paramettre l'ID de l'etudiant l'ecue correspondant et la session
    """


    notes = Note.objects.filter(etudiant_id=etudiant, evaluation__ecue__id=ecue, evaluation__annee=Annee.objects.last())

    if notes:
        notes_cc    = notes.filter(evaluation__typeEvaluation__libelle__startswith='c')
        moyenne_cc  = notes_cc.aggregate(Avg('note')) 

        exam        = notes.filter(evaluation__session__id=session, evaluation__typeEvaluation__libelle__startswith='e').last()
        if exam and notes_cc:
            moyenne     = ((moyenne_cc['note__avg'] * 0.4) if moyenne_cc['note__avg'] else None) + ((exam.note * 0.6) if exam.note else None)

            moyenneUe, res = MoyenneUe.objects.get_or_create(session_id=session, etudiant_id=etudiant, ue= Ecue.objects.get(pk=ecue).ue)

            moyenneEcue, res = MoyenneEcue.objects.get_or_create(moyenneUe=moyenneUe, ecue_id=ecue) # On verifie si la moyenne dans l'ecue avait deja ete calcule sion on en cre une 
            

            moyenneEcue.note = moyenne
            moyenneEcue.save()

            moyenneUe.moyenne_reelle = moyenneUe.moyenneUes.aggregate(Avg('note'))['note__avg']

            if moyenneUe.moyenne_reelle and moyenneUe.moyenne_reelle >= 10:
                    moyenneUe.valide = True
                                                            
            moyenneUe.save()