#! /usr/bin/env python
# Création et alimentation d'une petite base de données SQLite
# Langage : Python 3.4

import sqlite3

conn = sqlite3.connect("Librairie.sq3")     # Etablissement de la connexion à la BD
conn.row_factory = sqlite3.Row              # Retourner les enregistrements sous forme de tableaux associatifs
cur = conn.cursor()                         # Création du curseur

# Création des tables. L'utilisation de try/except permet de ré-utiliser le
# script indéfiniment, même si la base de données existe déjà.

try:
    # Création de la table Client
    req = """CREATE TABLE Client (
	ClientID INTEGER PRIMARY KEY AUTOINCREMENT,
	Nom VARCHAR(40) NOT NULL,
	Adresse VARCHAR(30) NOT NULL,
	Ville VARCHAR(30) NOT NULL,
	Canton CHAR(2) NOT NULL,
	NoPostal CHAR(4) NOT NULL
)"""
    cur.execute(req)

    # Création de la table Commande
    req = """CREATE TABLE Commande (
	CommandeID INTEGER PRIMARY KEY,
	Date DATE NOT NULL,
	ClientID INTEGER NOT NULL,

	FOREIGN KEY (ClientID) REFERENCES Client (ClientID)
)"""
    cur.execute(req)

    # Création de la table Produit
    req = """CREATE TABLE Produit (
	ProduitID INTEGER PRIMARY KEY,
	Description VARCHAR(60),
	TypeReliure VARCHAR(30),
	PrixUnitaire FLOAT
)"""
    cur.execute(req)

    # Création de la table LigneCommande
    req = """CREATE TABLE LigneCommande (
	CommandeID INTEGER NOT NULL,
	ProduitID INTEGER NOT NULL,
	Quantite INTEGER DEFAULT 1,
	
	PRIMARY KEY (CommandeID, ProduitID),
	FOREIGN KEY (CommandeID) REFERENCES Commande (CommandeID),
	FOREIGN KEY (ProduitID) REFERENCES Produit (ProduitID)
)"""
    cur.execute(req)

except:
    pass    # Si les tables existent déjà dans la base de données, on passe

# Transmission d'un message à l'utilisateur:

print("La base de données 'Librairie.sq3' a été créée avec succès ! \n")

# Insertion de quelques clients manuellement

print("Entrée des enregistrements de la table des clients :")

nom = input("Nom du prochain client (<Enter> pour terminer) : ")

while nom != '':
    adresse = input("Adresse : ")
    canton = input("Canton : ")
    numero = input("Numéro postal : ")
    ville = input("Ville : ")
    req = """INSERT INTO Client (Nom, Adresse,
Canton, NoPostal, Ville) VALUES (?, ?, ?, ?, ?)"""
    cur.execute(req, (nom, adresse, canton, numero, ville))     # Formatage des données par SQLite
    nom = input("Nom du prochain client (<Enter> pour terminer) : ")

# Transfert effectif des enregistrements dans la BD :
conn.commit()

# Une fois les clients entrés

print("Rappel des infos introduites dans la table Client:\n")

cur.execute("SELECT * FROM Client")
lignes = cur.fetchall()     # liste des enregistrements dont les valeurs des champs
                            # sont accessibles via le nom du champ en question

for l in lignes:
    for attribut in l.keys():
        print(str(attribut) + ':' + str(l[attribut]))

    print("############################\n") 


# Fermeture de la base de données:
cur.close()
conn.close()