# -*- encoding:utf-8 -*-

# Mini-système de base de données fonctionnant avec un dictionnaire
# pouvant être sauvegardé dans un fichier externe
# Clé : Nom de la personne
# Valeur: Tuple constitué de (age, taille)

# Définition des fonctions nécessaires:

def ajouter(table):
    """
    ajouter(dict table) --> None.
    Ajoute une nouvelle entrée à la base de données <table>
    au format {Nom1: (Age1, Taille1), Nom2: (Age2, Taille2),...}
    aussi longtemps que l'utilisateur le désire. Les données Nom, Age et Taille
    sont récupérées par la fonction elle-meme.
    """

    nom = input("Entrez le nom d'une nouvelle personne ou <Enter> pour terminer: ")
    
    while nom != "":
        age = int(input("Entrez son âge (en années): "))
        taille = float(input("Entrez sa taille (en mètres): "))
        table[nom] = (age, taille)      # associe le tuple (age, taille) à la clef "nom"
        nom = input("Entrez le nom d'une nouvelle personne ou <Enter> pour terminer: ")


def consulter(table):
    """
    consulter(dict table) --> None.
    Aussi longtemps que l'utilisateur le désire, cette fonction
    extrait un élément de la base de données <table> à
    partir de sa clef et affiche le résultat au format:
    
    Nom: {nomPersonne} - age: {agePersonne} ans - taille: {taillePersonne} m.
    
    Si la requete est non fructueuse, la fonction retourne le messsage:
    
    *** Nom inconnu! ***
    """
    
    nom = input("Entrez le nom d'une personne ou <Enter> pour terminer: ")

    while nom != "":
        couple = table.get(nom, False)  # récupère, si il existe, le tuple associé au nom

        if couple:
            age = couple[0]
            taille = couple[1]
            print("Nom: {} - âge: {} ans - taille: {:3.2f} m.".format(nom, age, taille))

        else:
            print("*** Nom inconnu ! ***")

        nom = input("Entrez le nom d'une personne ou <Enter> pour terminer: ")


def sauvegarder(table):
    """
    sauvegarder(dict table) --> None.
    Sauvegarde les éléments de la base de données <table>
    dans un fichier au format <Nom@Age#Taille>.
    """

    nomFichier = input("Entrez le nom du fichier de sauvegarde: ")

    fichier = open(nomFichier, 'w', encoding = 'Utf-8')

    # Parcours du dictionnaire entier, converti au préalable en liste
    # de tuples et écriture de chaque entrée de la base de données au
    # format "Nom@Age#Taille" sur une ligne du fichier

    for cle, valeur in list(table.items()):
        fichier.write(cle + "@" + str(valeur[0]) + "#" + str(valeur[1]) + "\n")

    fichier.close()

    

def remplir(table):
    """
    remplir(dict table) --> None.
    Remplit la base de données <table>
    à partir de données situées dans un fichier externe.
    """

    flag = 1

    nomFichier = input("Entrez le nom du fichier de sauvegarde: ")

    while flag:

        try:
            fichier = open(nomFichier, 'r', encoding = 'Utf-8')

        except:
            print("*** Fichier inexistant ***")
            nomFichier = input("Entrez un nom de fichier valide: ")

        else:
            flag = 0

    ligne = fichier.readline()

    while ligne != "":
        element = ligne.split("@")
        cle = element[0]
        valeur = element[1]
        data = valeur.split("#")
        age, taille = int(data[0]), float(data[1])
        table[cle] = (age, taille)
        ligne = fichier.readline()

# Corps principal du programme:

# Variable globale au programme:

table = {}                                                                  # dictionnaire contenant les données de la base
operation = {'A': ajouter, 'C': consulter, 'S':sauvegarder, 'R':remplir}    # dictionnaire contrôlant le flux d'excution

# Utilisation du programme:
action = input("""Choisissez:
(R)écupérer une base de données préexistante sauvegardée dans un fichier
(A)jouter des données à la base de données courante
(C)onsulter la base de données courante
(S)auvegarder la base de données courante dans un fichier
(T)erminer: """).upper()
while action != 'T':
    operation[action](table)
    action = input("Choisissez: (A)jouter - (C)onsulter - (S)auvegarder - (R)emplir - (T)erminer: ")           
