# générateur de tableau HTML

# Importation de modules:

import sqlite3

def html_from_sql_result(cursor):
    """
    Retourne le code HTML affichant les enregistrements situés dans le curseur <cursor>
    sous la forme d'un tableau
    """
    ############################################
    # Compléter le code aux endroits indiqués: #
    ############################################

    code = ''       # création du code HTML à générer

    # Récupération de tous les enregistrements du curseur sous forme de liste d'objets Row
    enregistrements = # à compléter

    try:
        # Récupération de la liste des noms de champs
        nomAttributs = # à compléter
        
    except:
        code += '<div class = "sqlResult"> La requête n\'a retourné aucun résultat.</div>'

    else:
        # si la requête donne lieu à plusieurs enregistrements en résultat
        if len(enregistrements) > 0:

            # code XHTML de l'en-tête du tableau en tant qu'élément de la classe css .sqlResultHeader
            table_header = '<tr class ="sqlResultHeader"><th>{donnees}</th></tr>\n'.format(donnees='</th><th>'.join(nomAttributs))

            # code XHTML du corps du tableau: les lignes sont des éléments de la classe css .rowclass0 ou .rowclass1
            # selon leur position dans la table (=> alternance de couleurs des lignes)
            table_enregistrements = ''
            row_index = 0

            for e in enregistrements:

                # récupération des valeurs des attributs associés à l'enregistrement traité
                # dans une liste <valeurs>
                valeurs = []
                # à compléter
                


                # construction du code XHTML de la ligne du tableau associée à l'enregistrement traité
                # dans la chaine <table_enregistrements>
                
                # à compléter


            code += '<table>\n {entete} \n {contenu} \n</table>\n'.format(entete=table_header, contenu=table_enregistrements)

        # si la requête ne donne pas lieu à plusieurs enregistrements en résultat
        else:
            code += '<div class = "sqlResult"> La requête s\'est exécutée mais n\'a retourné aucun résultat.</div>'

    return code


########## Corps principal du programme ##############

db = 'Librairie.sq3'                # base de données associée


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

# choix de 2 requetes donnant des résultats différents:

# Liste ordonnée des clients fribourgeois et neuchatelois:
req1 = """SELECT Nom, Adresse, NoPostal, Ville
FROM Client
WHERE Canton = 'FR' OR Canton = 'NE'
ORDER BY Canton, Nom"""

# Liste des clients genevois avec leur nombre d'articles commandés:
req2 = """SELECT Nom, Adresse, NoPostal, Ville, SUM(Quantite) AS 'Total Commandes'
FROM Client, Commande, LigneCommande
WHERE Client.ClientID = Commande.ClientID
AND Commande.CommandeID = LigneCommande.CommandeID
AND Canton = 'GE'
GROUP BY Client.ClientID"""

print("Choisissez la requete que vous voulez lancer:")
print("1 : liste ordonnée des clients fribourgeois et neuchatelois")
print("2 : liste des clients genevois avec leur nombre d'articles commandés")
choix = int(input("Votre choix: "))

if choix == 1:
    cur.execute(req1) # exécution de la requête SQL no 1
else:
    cur.execute(req2) # exécution de la requête SQL no 1

# Création du code XHTML du tableau récupérant les enregistrements:
code = html_from_sql_result(cur)

print("""Le code généré par votre fonction est le suivant.
Comparez-le avec le code que vous devriez réellement obtenir avant
de passer à l'étape suivante.\n""")

print(code)
