#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include "gestionlist.h"
#include "malist.h"

int main(int argc, char *argv[])
{
void print_entete(void){
         printf ("ID \t"); 
         printf ("NOM  \t"); 
         printf ("Filiere  \n"); 
}
/*
Création de 4 étudiants
*/

struct etudiant_s premier ; 
premier.nom = "premier" ;
premier.filiere = "M1";
premier.id=1;
premier.moyenne=10;
INIT_LIST_HEAD(&premier.etudiant);  
INIT_LIST_HEAD(&premier.M1);      
INIT_LIST_HEAD(&premier.M2);
 
struct etudiant_s second ; 
second.nom = "second" ;
second.filiere = "M1";
second.id=2;
second.moyenne=9;
INIT_LIST_HEAD(&second.etudiant);  
INIT_LIST_HEAD(&second.M1);  
INIT_LIST_HEAD(&second.M2);

struct etudiant_s troisieme ; 
troisieme.nom = "trois" ;
troisieme.filiere = "M1";
troisieme.id=3;
troisieme.moyenne=18;
INIT_LIST_HEAD(&troisieme.etudiant);  
INIT_LIST_HEAD(&troisieme.M1);  
INIT_LIST_HEAD(&troisieme.M2);  

struct etudiant_s quatrieme ; 
quatrieme.nom = "quatre" ;
quatrieme.filiere = "L";
quatrieme.id=4;
quatrieme.moyenne=18;
INIT_LIST_HEAD(&quatrieme.etudiant);  
INIT_LIST_HEAD(&quatrieme.M1);  
INIT_LIST_HEAD(&quatrieme.M2); 

/*
initialisation des listes : etudiants (et M1)
c-a-dire on cree un chainon etudiants qui pointe sur le debut de la liste etudiants
ce chainon ne contient rien sauf deux pointeur sur la liste etudiants
il represente la tete de la liste
*/

LIST_HEAD(etudiants);
LIST_HEAD(M1s);
    
/*
création de la liste des etudiants
creation des liens en tete
*/
list_add(&quatrieme.etudiant,&etudiants);
list_add(&troisieme.etudiant,&etudiants);
list_add(&second.etudiant,&etudiants);
list_add(&premier.etudiant,&etudiants);


/*
création de la liste des M1
creation des liens en queue (juste pour le fun)
*/
list_add_tail(&premier.M1,&M1s);
list_add_tail(&second.M1,&M1s);
list_add_tail(&troisieme.M1,&M1s);


struct list_head * position ; 

//
// le top du top

struct etudiant_s *ptr;

printf ("-----------liste des etudiants en M1 -----------\n");
print_entete();
list_for_each_entry(ptr,&M1s,M1){

         printf ("%d\t" , ptr->id ); 
         printf ("%s\t" , ptr->nom); 
         printf ("%s\n" , ptr->filiere); 
}

// utilisation de list_move
//on fait passer les etudiants en M2 si mod id =0

LIST_HEAD(M2s);

//il faut passer par la liste etudiants

list_for_each_entry(ptr,&etudiants,etudiant){
    if (!strcmp(ptr->filiere,"M1") && (ptr->moyenne>=10)){
            ptr->filiere="M2";
            list_del(&(ptr->M1));
            list_add_tail(&(ptr->M2),&M2s);
    }
}


printf ("-----------liste des etudiants en M2 -----------\n");
print_entete();
list_for_each_entry(ptr,&M2s,M2){
         printf ("%d\t" , ptr->id ); 
         printf ("%s\t" , ptr->nom); 
         printf ("%s\n" , ptr->filiere); 
}



printf ("-----------liste des etudiants en M1 -----------\n");
print_entete();
list_for_each_entry(ptr,&M1s,M1){// ne pas utiliser list_for_each pour detuire
         printf ("%d\t" , ptr->id ); 
         printf ("%s\t" , ptr->nom); 
         printf ("%s\n" , ptr->filiere); 
}

struct list_head *n; 
// permet de detruire l'element pointe et de continuer
list_for_each_safe(position, n, &etudiants)
    { 
        list_del(position); // reste a faire free 
    } 


  system("PAUSE");	
  return 0;
}