# -*- coding:utf-8 -*-

__nom_fichier__ = "promo"
__author__ = "tinet1"
__date__ = "mars 2018"

"""
Exercices - Fichier

Gestion de scolarité

classe Promo
"""

from eleve import Eleve

class Promo:
    
    def __init__(self,nom, f_eleves, f_matieres):
        """
        Méthode constructeur, crée les attributs nom_, feleves_, fmatières_, leleves_, lmatieres_
        :param nom: Nom de la promo
        :param f_eleves: Fichier de données des élèves, avec les notes
        :param f_matieres: Fichier de données des matières avec les coefficients
        """
        self.nom_ = nom
        self.feleves_ = f_eleves
        self.fmatieres_ = f_matieres
        self.creeListeEleves()
        self.creeListeMatieres()
        
    def creeListeEleves(self):
        """
        Crée l'attribut leleves_ : liste des élèves de la promotion
        :return: None
        """
        # Ouverture du fichier de données
        f_in = open(self.feleves_,'r')

        # Création de la liste d'élèves
        self.leleves_ = []
        
        for ligne in f_in:
            ligne = ligne.split()
            
            notes = [float(n) for n in ligne[1:]]
            self.leleves_.append(Eleve(ligne[0],notes))

        # Fermeture du fichier
        f_in.close()

    def creeListeMatieres(self):
        """
        Crée l'attribut lmatieres_ : liste de doublets nom de matière , coefficient
        :return: None
        """
        # Ouverture du fichier
        f_in = open(self.fmatieres_,'r')

        # Création de la liste de matières
        self.lmatieres_ = []

        for ligne in f_in:
            matiere, coeff = ligne.split()
            
            self.lmatieres_.append((matiere, int(coeff)))

        # Fermeture du fichier
        f_in.close()    
        
    def calculeLesMoyennes(self):
        """
        Calcule les moyennes de chaque élève et les sauvegarde dans un fichier
        :return: None
        """
        # Liste des coefficients
        coeff = [val for (nom, val) in self.lmatieres_]

        # Ouverture du fichier des moyennes
        f_out = open("moyennes.txt",'w')

        # Calcul et sauvegarde des moyennes
        for eleve in self.leleves_:
            moy = eleve.moyenne(coeff)

            # On écrit que 2 chiffres après la virgule
            f_out.write(eleve.getNom() + " ; " + str(round(moy,2)) + "\n")

        # Fermeture du fichier
        f_out.close()
        
    def filtreNotesMatiere(self, matiere):
        """
        Crée un fichier qui compile les notes des élèves pour une matière donnée
        :param matiere: matière choisie
        :return: None
        """

        # Liste des matières
        matieres = [nom for (nom, val) in self.lmatieres_]
        # La matière choisie ne fait pas partie des matières existantes
        if matiere not in matieres:
            print("Matière non existante / notée >.<")
            return

        # Indice de la matière dans la liste
        loc = matieres.index(matiere)

        # Ouverture du fichier
        f_out = open("notes_" + matiere + ".txt",'w')

        # Sauvegarde de la note pour chaque élève
        for eleve in self.leleves_:
            f_out.write(eleve.getNom() + " ; " + str(eleve.getNotes()[loc]) + "\n")

        # Fermeture du fichier
        f_out.close()
        
    def filtreElevesMoyens(self, matiere):
        """
        Affiche les noms des élèves ayant une note inférieure à la moyenne pour une matière donnée
        :param matiere: Matière choisie
        :return: None
        """
        # Création du fichier filtré
        self.filtreNotesMatiere(matiere)

        # Ouverture du fichier
        f_in = open("notes_" + matiere + ".txt",'r')

        # Calcul de la moyenne des élèves pour la matière
        moy = 0
        nb = 0
        
        for ligne in f_in:
            nom, note = ligne.split(';')
            nb += 1
            moy += float(note)
            
        moy /= nb

        # Retourne au début du fichier (aussi possible de fermer puis rouvrir le fichier
        f_in.seek(0)

        # Recherche et affichage des élèves ayant une note inférieure à la moyenne
        for ligne in f_in:
            nom, note = ligne.split(';')
            
            if float(note) < moy:
                print(nom)

        # Fermeture du fichier
        f_in.close()
     
        


if __name__ == "__main__":
    
    # Validation
    
    eleves = "Eleves.dta"
    matieres = "Matieres.dta"
    
    prom = Promo("2040",eleves, matieres)

    prom.calculeLesMoyennes()
    prom.filtreElevesMoyens("geol")
    

