# Editeur SQL permettant d'interroger la base de donnée Librairie.sq3
# au travers d'une interface graphique utilisateur

# Importation de modules:
import sqlite3
from tkinter import *
from exercice3Sol import *


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

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

    def __init__(self, db, templatename, cssname):
        "Constructeur de l'objet Application"
        Tk.__init__(self)
        self.title("Editeur graphique SQL")

        # Zone de saisie de requetes:
        self.zoneReq = Text(self, height=10, width=50, background='white', font='Arial')
        self.zoneReq.insert(INSERT,  "Entrez votre requete")
        self.zoneReq.pack(fill=X)

        # Bouton d'exécution:
        Button(self, text="Exécuter", command = self.executer).pack(fill=X)

        # Création de la partie réceptionnant les résultats:
        self.cadre= Frame(self, background='white')
        self.cadre.pack(fill=X)
        self.zoneResult = PanedWindow(self.cadre, orient=VERTICAL)
        self.zoneResult.pack()

        # Boutons de gestion:
        Button(self, text="Enregistrer", command = self.enregistrer).pack(side=RIGHT)
        Button(self, text="Effacer", command = self.effacer).pack(side=RIGHT)
        Button(self, text="Quitter", command = self.fermer).pack(side=RIGHT)

        # 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

        # Attributs d'enregistrements:
        # fichier HTML patron
        # feuille de style CSS
        # compteur de requete


    def executer(self):
        "Exécute la requete entrée"

        # Récupération de la requete:
        requete = self.zoneReq.get(1.0, END)

        # Exécution de la requete:
        try:
            self.cur.execute(requete)           # exécution de la requete SQL
            
        except:                                 # récupération de l'erreur
            print("*** Requete SQL incorrecte ***")
            print(requete)
            
        else:                                   # traitement du résultat

            enregistrements = self.cur.fetchall()        # récupère les enregistrements situés dans le curseur
            champs = enregistrements[0].keys()           # récupère la liste des champs du premier enregistrement

            # effacement du résultat précédent:
            self.effacer(totalite=0)


            # Affichage des entetes de colonnes contenant le nom des champs:
            entete = PanedWindow(orient=HORIZONTAL)
            self.zoneResult.add(entete)
            
            for c in champs:
                cellule = Label(entete, width=20, text=c, bg='yellow', relief=RAISED)
                entete.add(cellule)

            # Affichage des enregistrements résultants:
            couleur = ['lightgreen', 'lightblue']
            i = 0
            
            for l in enregistrements:
                
                ligne = PanedWindow(orient=HORIZONTAL)
                self.zoneResult.add(ligne)
                
                for c in champs:
                    cellule = Label(ligne, width= 20, text=str(l[c]), bg=couleur[i])
                    ligne.add(cellule)

                i = (i + 1) % 2

    def enregistrer(self):
        """
        Permet d'enregistrer définitivement
        le résultat d'une requete dans un tableau HTML
        """
        # Récupération de la requete

        # Exécution de la requete:
        try:
            # exécution de la requete SQL
            
        except:
            # affichage d'un message d'erreur
            

        else:
            # création du code HTML du tableau récupérant les résultats

            # création du fichier réceptionnant le tableau des résultats.
            # Ce fichier sera situé dans un répertoire "annexes" avec les
            # fichiers nécessaires au fonctionnement du programme:

            # insertion du code HTML généré dans le fichier:


    def effacer(self, totalite=1):
        """
        Efface le résultat précédent. La requete est également
        effacée si le parametre <totalite> est à 1 
        """

        if totalite:
            # effacement du contenu de la zone de saisie de requete:
            self.zoneReq.delete(1.0, END)
            self.zoneReq.insert(INSERT, "Entrez votre requete")

        # destruction et reconstruction de la zone d'affichage des résultats:
        self.zoneResult.destroy()
        self.zoneResult = PanedWindow(self.cadre, orient=VERTICAL)
        self.zoneResult.pack()


    def fermer(self):
        "Ferme curseur, connexion et détruit la fenetre"
        self.conn.commit()                      # Transmission des requetes à la base de données
        self.cur.close()                        # Fermeture du curseur
        self.conn.close()                       # Fermeture de la connexion
        self.destroy()                          # Destruction de la fenetre
        


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

Application('annexes/Librairie.sq3', 'annexes/template.html', 'annexes/MonStyle.css').mainloop()
