#! /usr/bin/env python

import sys
import pickle # module des routines de la serialisation et la deserialisation d'objets python
import csv # module des routines permettant la lecture/ecriture de fichiers csv
from time import gmtime


class Agenda:  # definition d'une classe 
    nom = ""
    prenom = ""
    telephone = ""
    dateNaissance = ""

# liste des mois
lmois = ['janvier','fevrier','mars','avril','mai','juin',
        'juillet','aout','septembre','octobre','novembre','decembre']

def ajouterFiche (f): # ajouter une fiche
    # demander la saisie des informations
    nom = (raw_input("Entrez le nom: "))
    prenom = (raw_input("Entrez le prenom: "))
    telephone = (raw_input("Entrez le tel: "))
    # creer un objet de classe Agenda et l'initialiser
    x = Agenda()
    x.nom = nom
    x.prenom = prenom
    x.telephone = telephone
    # ajouter l'objet a la liste
    f.append(x) 

def chargerFiches (f): # charger les fiches dans la liste
    try :
        fich = open("./agenda.txt",'r') # ouvrir un fichier en lecture et recuperer une instance
        
        for enreg in fich.readlines() :
                enreg = enreg.strip() # suppression espaces et retours
                items = enreg.split(';') # decoupage
                # recuperation des elements
                nom = items[0]
                prenom =  items[1]
                telephone =  items[2]
                # creer un objet de classe Agenda etl'initialiser
                x = Agenda()
                x.nom = nom
                x.prenom = prenom
                x.telephone = telephone
                # ajouter l'objet a la liste
                f.append(x)

        fich.close() # fermer le fichier
    except IOError as (errno, strerror) :
        print "I/O error({0}): {1}".format(errno, strerror)
       # print "erreurn io"
       #"I/O error(%s): %s" #% (erreur.errno, strerror)
    except Exception as inst :
        print 'acces impossible au fichier'
        print inst.args      # arguments stored in .args

def chargerFichesCSV (f): # charger les fiches dans la liste
    try :
        fich = csv.reader(open("./agenda.txt","rb")) # ouvrir un fichier en lecture et recuperer une instance
        
        for enreg in fich :
                enreg = enreg.strip() # suppression espaces et retours
                items = enreg.split(';') # decoupage
                # recuperation des elements
                nom = items[0]
                prenom =  items[1]
                telephone =  items[2]
                # creer un objet de classe Agenda etl'initialiser
                x = Agenda()
                x.nom = nom
                x.prenom = prenom
                x.telephone = telephone
                # ajouter l'objet a la liste
                f.append(x)

        fich.close() # fermer le fichier
    except IOError, (errno, strerror):
        print "I/O error(%s): %s" % (errno, strerror)
    except Exception,inst :
        print 'acces impossible au fichier'
        print inst.args      # arguments stored in .args

def chargerFiches2 (f): # charger les fiches dans la liste
    try :
        fich = open("./agenda.txt",'r') # ouvrir un fichier en lecture et recuperer une instance
        for enreg in fich.readlines() :
            print "lecture "
            # creer un objet de classe Agenda etl'initialiser
            x = pickle.load(enreg)
            f.append(x)

        fich.close() # fermer le fichier
    except IOError, (errno, strerror):
        print "I/O error(%s): %s" % (errno, strerror)
    except Exception,inst :
        print 'acces impossible au fichier'
        print inst.args      # arguments stored in .args

def afficherFiches (f): # affiches toutes les fiches
    print len(f),'elements dans la liste'
    for x in f :
        print x.nom,x.prenom,x.telephone
        
def sauverFiches (f): # sauvegarder toutes les fiches
    fich = open("./agenda.txt",'w') # ouvrir un fichier en ecriture et recuperer une instance
    print len(f),'elements dans la liste...'
    for x in f :
        fich.write( x.nom+';'+ x.prenom+';' + x.telephone + '\n')
    fich.close()
    print '...sauvegarde effectuee.'
        
def sauverFichesCSV (f): # sauvegarder toutes les fiches (forme csv)
    fich = csv.writer(open("./agenda.txt", "wb")) # ouvrir un fichier en ecriture et recuperer une instance
    print len(f),'elements dans la liste...'
    fich.writerow(["nom","prenom","telephone"])
    for x in f :
        fich.writerow([x.nom,x.prenom,x.telephone])
    fich.close()
    print '...sauvegarde effectuee.'
        
def sauverFiches2 (f): # sauvegarder toutes les fiches (forme de serialisation)
    fich = open("./agenda.txt",'w') # ouvrir un fichier en ecriture et recuperer une instance
    print len(f),'elements dans la liste...'
    for x in f :
        pickle.dump(x,fich)
    fich.close()
    print '...sauvegarde effectuee.'
        
def supprimerFiche (f): # supprimer une fiche
    nom = (raw_input("Entrez le nom: "))
    prenom = (raw_input("Entrez le prenom: "))
    i = 0
    for x in f :
        if (nom == x.nom or nom == "" ) and (prenom == x.prenom or prenom == "" ) :
            i = i + 1
            print i,'-',x.nom,x.prenom,x.telephone
    if i > 0 : # il y a des fiches correspondant aux criteres
        num = int(raw_input("Entrez le numero de la fiche a supprimer: "))
        if num > 0 and num <= i:
            f.pop(num)
        else:
            print 'choix de ligne errone...recommencer...'

def saisirChoix() :    # afficher le menu, saisir le choix et retourner sa valeur
    choix = 0
    print 'Menu'
    print '1 - ajouter une fiche'
    print '2 - afficher toutes les fiches'
    print '3 - supprimer une fiche'
    print '9 - terminer'
    while choix < 1 or choix > 9:
        try:
            choix = int(raw_input("entrez votre choix: "))
        except:
            print '...c\'est pourtant simple...'
    return choix

def afficherTitre() :    # afficher un titre
    dateDuJour = gmtime()
    annee = dateDuJour.tm_year
    mois = dateDuJour.tm_mon # entre 1 et 12
    jour= dateDuJour.tm_mday
    print 'bonjour'
    print 'nous sommes le ',jour,lmois[mois - 1],annee

#
# programme principal
#
afficherTitre()

fiches = [] # definit une liste vide
chargerFiches(fiches) #initialiser la liste des fiches

choix = saisirChoix()
while (choix != 9) : # boucle de traitement
    if choix == 1 : ajouterFiche(fiches)
    elif choix == 2 : afficherFiches(fiches)
    elif choix == 3 : supprimerFiche(fiches)
    elif choix == 9 :
            print 'fin'
    else :
            print 'choix errone'
    choix = saisirChoix()

sauverFiches(fiches)
print 'fin du programme'

# autre version de la boucle de traitement : 
# continuer = true
# while continuer :
#       choix = saisirChoix()
#       if choix == 9 :
#           continuer = false
#       elif ...
#

