import pymysql as SGBD     # Installer la bibliothèque pymysql si nécessaire

def affiche_table(resultats: list) -> None:
    """Affiche une liste de dictionnaires partageants les mêmes clés sous
       la forme d'un tableau avec une taille de colonne fixe calculé pour chaque
       colonne en fonction de son contenu le plus long."""
    if len(resultats) == 0:
        return
    # Détermination des tailles des colonnes
    taille_max = {}
    for col in resultats[0].keys():
        taille_max[col] = len(str(col))  # Taille de départ = celle du titre
        for ligne in resultats:
            if len(str(ligne[col])) > taille_max[col]:
                taille_max[col] = len(str(ligne[col]))
    
    # Affichage de l'en-tête (et calcul de la taille d'une ligne)
    print("| ",end="")
    taille_ligne = 2
    for col in resultats[0].keys():
        print(col, end=" "*(taille_max[col] - len(col) + 1) )
        taille_ligne += 3 + taille_max[col]
        print("| ", end="")
    taille_ligne -= 1       # (pour retirer le dernier espace inutile)
    print()

    # Affichage de la ligne sous l'en-tête
    print("-"*(taille_ligne))
    # Affichage des données
    for ligne in resultats:
        print("| ", end="")
        for col in ligne.keys():
            print(ligne[col], end=" "*(taille_max[col]-len(str(ligne[col]))+1) )
            print("| ", end="")
        print()
    
def execute_et_affiche(bd: SGBD.Connection, sql:str):
    """Exécute la commande SQL donnée en argument avec la base de donnée bd
       donnée en argument et affiche le raésultat sous forme de tableau"""
    with bd.cursor() as cursor:
        cursor.execute(sql)
        resultats = cursor.fetchall()
        affiche_table(resultats)
        print()

def initialiseBD(nom_base: str,user="root",password="root") -> SGBD.Connection:
    """Connecte python à la base de donnée donnée en argument et renvoie un
       objet Connection pour travailler dessus."""
    return SGBD.connect(host='localhost',
                        user='root',
                        password='root',
                        charset='utf8mb4',
                        database=nom_base,
                        autocommit=True,
                        cursorclass=SGBD.cursors.DictCursor)
    
def fermeBD(bd: SGBD.Connection) -> None:
    """Ferme la base de donnée en argument ainsi que la connection au SGBD."""
    bd.close()

# QUESTION 4
def menu() -> int:
    """Affiche le menu, demande à l'utilisateur son choix et renvoie un
       entier correspondant au choix effecué. La fonction s'assure que le choix
       est correct."""
    texte_menu = "Menu du programme :\n" + \
                 "1) Afficher les informations d’un élève\n" + \
                 "0) Quitter"
    choix_possibles = ['0','1']
    choix = None
    while choix not in choix_possibles:
        print(texte_menu)
        choix = input("Choisissez une option : ")
    return int(choix)

def affiche_info_eleve(bd: SGBD.Connection) -> None:
    # TODO
    pass


#######################
# Programme principal #
#######################

bd = initialiseBD("pronote")   # mysql sera une variable globale

fin_programme = False
while not fin_programme:
    choix = menu()
    if choix == 0:
        fin_programme = True
    elif choix == 1:
        affiche_info_eleve(bd)

fermeBD(bd)   # Fermeture de la base de données



