/* yz@ai.univ-paris8.fr */
/* annuaire telephonique */

#include <stdio.h>
#include <string.h>

// Creer un nouveau type de structure Personne
typedef struct personne {
  char nom[32];
  char telephone[16];
} Personne;

// Creer un nouveau type de structure Carnet
typedef struct carnet {
  Personne perso[20];
  int n;
} Carnet;

Personne creePersonne(char *nom, char *telephone) {
  Personne p;
  
  strcpy(p.nom, nom); // c'est faux si on ecrit : p.nom = nom;
  strcpy(p.telephone, telephone); // c'est faux si on ecrit : p.telephone = telephone;
  
  return p;
}

void affichePersonne(Personne *p) {
  printf("%s\t%s\n", p->nom, p->telephone);
}

void ajoutePersonne(Carnet *c, Personne p) {
  if(c->n < 20)
    c->perso[c->n++] = p;
  else
    printf("Carnet est plein !\n");
}

void afficheCarnet(Carnet *c) {
  int i;
  
  for(i = 0; i < c->n; i++)
    affichePersonne(&c->perso[i]);
}

void supprime(Carnet *c, int position) {
  if(c->n != 0)
    c->perso[position] = c->perso[--c->n];
  else
    printf("Carnet est vide !\n");
}

void trie(Carnet *c) { // tri par propagation
  int n = c->n, newn, i;
  Personne p;
  
  while(n != 0) {
    newn = 0;
    for(i = 1; i < n; i++) {
      if(strcmp(c->perso[i-1].nom, c->perso[i].nom) > 0) {
	p = c->perso[i-1];
	c->perso[i-1] = c->perso[i];
	c->perso[i] = p;
	newn = i;
      }
    }
    n = newn;
  }
}

int recherche(Carnet *c, char *nom) {
  int i;
  
  for(i = 0; i < c->n; i++) {
    if(strcmp(c->perso[i].nom, nom) == 0)
      return i;
  }
  
  return -1;
}

int main() {
  char commande;
  char nom[32], telephone[16];
  
  int position;
  
  Personne p;
  Carnet c = {{},0};
  
  do {
    printf("--------------------menu--------------------\n");
    printf("[A] : Ajouter une personne au Carnet\n");
    printf("[D] : Supprimer une personne au Carnet\n");
    printf("[V] : Affichage du carnet\n");
    printf("[S] : Recherche d'une personne dans au Carnet\n");
    printf("[T] : Trier les personne dans un carnet par ordre alphabétique\n");
    printf("[Q] : Quitter\n");
    
    commande = getchar();
    switch(commande) {
    case 'A':
      printf("Saisir un nom et un numero de telephone : ");
      scanf("%s %s", nom, telephone);
      p = creePersonne(nom, telephone);
      ajoutePersonne(&c, p);
      break;
    case 'D':
      printf("Saisir une position : ");
      scanf("%d", &position);
      supprime(&c, position);
      break;
    case 'V':
      afficheCarnet(&c);
      break;
    case 'S':
      printf("Saisir un nom : ");
      scanf("%s", nom);
      position = recherche(&c, nom);
      if(position != -1)
	affichePersonne(&c.perso[position]);
      else
	printf("Personne inconnue\n");
      break;
    case 'T':
      trie(&c);
      break;
    }
    getchar(); // pour vider le buffer, plus efficace que fflush(stdin)
  } while(commande != 'Q');
  
  return 0;
}
