# Interface utilisateur permettant d'entrer, trouver et mettre à jour
# des informations dans la table Client de la base de données Librairie.sq3

# Importation de modules:
import sqlite3
from tkinter import *
from tkinter.messagebox import *        # module permettant de créer des fenetres intempestives


########## Classe de l'application ###########

class Application(Tk):
    "Classe de l'application principale"

    def __init__(self, db):
        "Constructeur de l'objet Application"
        Tk.__init__(self)
        self.title("Gestionnaire de base de données")

        # Boutons d'exécution de requetes:
        self.boutons = PanedWindow(self, orient = HORIZONTAL)
        self.boutons.grid(columnspan = 2)
        self.boutons.add(Button(self, text="Rechercher", command = self.rechercher))
        self.boutons.add(Button(self, text="Ajouter", command = self.ajouter))
        self.boutons.add(Button(self, text="Actualiser", command = self.actualiser))
        self.boutons.add(Button(self, text="Effacer", command = self.detruire))
        self.boutons.add(Button(self, text="Mise à zéro", command = self.vider))
        self.boutons.add(Button(self, text="Aide", command = self.aider))

        # Liste des noms des nomChamps d'un client:
        nomChamps = ['Nom', 'Adresse', 'Ville', 'Canton', 'NoPostal']

        # Dictionnaire reliant chaque nom de champ (clé) à la zone de
        # saisie de texte correspondante (valeur)
        self.champs = {}

        # Création d'une zone de saisie de texte pour chaque champ:
        for i in range(len(nomChamps)):
            # positionner la zone de texte avec son étiquette de texte:
            texte = Label(self, text = nomChamps[i] + ":", font=("Arial", 14))
            texte.grid(row = i+1, column = 0)
            saisie = Entry(self, font = "Courier 12")
            saisie.grid(row = i+1, column = 1, padx=5)

            # associer le nom de chaque champ à sa zone de saisie correspondant:
            self.champs[nomChamps[i]] = saisie

        # Bouton de fermeture:
        Button(self, text="Quitter", command=self.fermer).grid(row=i+2, column = 1, padx=5, sticky=E)

        # Identifiant du client actuellement affiché
        self.ID = ""

        # Ouverture de connexion et définition du curseur
        self.conn = sqlite3.connect(db)             # Connexion à la BD
        self.conn.row_factory = sqlite3.Row         # Retourner les enregistrements sous forme de tableau associatif
        self.cur = self.conn.cursor()               # Initialisation du curseur

    def rechercher(self):
        """Recherche un client selon les critères entrés"""

        return None

        
    def ajouter(self):
        """Ajout d'un client dans la base de données"""

        # requete à envoyer à la BD
        debutRequete = "INSERT INTO Client("
        finRequete = "VALUES("

        # flag permettant de déterminer si tous les nomChamps ont été remplis
        flag = 1

        for c in self.champs.keys():

            val = self.champs[c].get().replace("'", "''")   # récupérer la valeur du champ entrée
                                                            # en remplaçant les guillemets simples
                                                            # en guillemets doubles
            
            # si un champ est vide, retourner un message d'erreur dans
            # une fenetre intempestive (pop-up)
            if val == "":
                flag = 0
                showerror("Erreur", "Tous les nomChamps doivent etre remplis !")
                break

            # sinon poursuivre l'écriture de la requete
            else:
                debutRequete += # A COMPLETER
                finRequete += # A COMPLETER

        # si tous les nomChamps ont été saisis, terminer la création de la requete:
        if flag:
            debutRequete = # A COMPLETER
            finRequete = # A COMPLETER
            requete = debutRequete + finRequete
            
            if askyesno("Attention !", "Voulez-vous vraiment enregistrer ce client ?"):
                try:
                    self.cur.execute(requete)
                except TypeError as e:
                    print("Erreur dans la requete exécutée:")
                    print(requete)
                    print(e)
                else:
                    # Exécution définitive de la requete dans la base de données
                    # Avertir l'utilisateur que l'enregistrement a été sauvegardé
                    # à l'aide d'une fenetre de type showinfo
                    # Vider le contenu de chaque zone de saisie de texte du formulaire

                    # A COMPLETER
 
            

    def actualiser(self):
        """Met à jour un enregistrement"""

        return None

        
    def detruire(self):
        """Détruit un enregistrement"""

        return None


    def vider(self):
        "Vide le contenu de chaque saisie de texte"

        for c in self.champs:
            self.champs[c].delete(0, END)

        self.ID = ""



    def aider(self):
        "Affiche un message d'aide à l'utilisateur"

        showinfo("Aide", """Cliquez sur 'Rechercher' pour trouver un enregistrement.

Cliquez sur 'Ajouter' pour sauvegarder un enregistrement.

Cliquez sur 'Actualiser' pour mettre à jour un enregistrement existant.

Cliquez sur 'Effacer' pour détruire un enregistrement existant.

Cliquez sur 'Mise à zéro' pour vider tous les champs.""")

    def fermer(self):
        "Ferme curseur, connexion et détruit la fenetre"
        self.cur.close()                # Fermeture du curseur
        self.conn.close()               # Fermeture de la connexion
        self.destroy()                  # Destruction de la fenetre

        
########## Programme principal ###########

Application('Librairie.sq3').mainloop()
