/* gcc -Wall -std=gnu99 gestion_imprimantes.c gestion_file.o -o gestion_imprimantes */

#include <stdio.h>
#include "gestion_file.h"
#include "types_imprimante.h"

void demarrage() {
  initialiserTout ();
  printf ("vous disposer de %d imprimantes numérotées de 0 à %d et vous pouvez mettre en attente jusqu'à %d requetes d'impression\n", P, P-1, Nmax);
}

void menu()
{
    printf("action?\n");
    printf("a pour initialiser toutes les imprimantes\n");
    printf("i pour initialiser une imprimante particuliere\n");
    printf("v pour savoir si une imprimante particuliere a une requete à traiter\n");
    printf("d pour deposer une requete particuliere sur une imprimante particuliere\n");
    printf("e pour extraire la premiere requete d'une imprimante particuliere\n");
    printf("c pour consulter la premiere requete d'une imprimante particuliere\n");
    printf("p pour visualiser l'état de la pile\n");
}

void choix_action(char *cde)
{
  char nul;
  menu();
  scanf("%c%c", cde, &nul);
}

void choix_imprimante(int *imp)
{
  char nul;
  printf("numero de l'imprimante? ");
  scanf("%d%c",imp, &nul);
}

void choix_requete (requete *x)
{
  char nul;
  printf("numero de requete? ");
  scanf("%d%c", x, &nul);
}

void execution_action (char cde) {
  int imp, req;
  int retour;
  switch (cde) {
    case 'a': 
      initialiserTout();
      printf ("requetes effacees\n");
      break;
    case 'i': 
      choix_imprimante(&imp);
      initialiserImp (imp);
      printf ("requetes de l'imprimantes %d effacees\n", imp);
      break;
    case 'v':
      choix_imprimante(&imp);
      retour = plusDeRequete (imp);
      if (retour) {
	printf ("il n'y a plus de requete pour l' imprimante %d\n", imp);
      }
      else {
	printf ("l'imprimante %d a encore des requetes à executer\n", imp);
      }
      break;
    case 'd':
      choix_imprimante(&imp);
      choix_requete(&req);
      retour = deposer (req, imp);
      if (!retour) {
	printf ("requete %d deposee pour l'imprimante %d\n", req, imp);
      }
      else {
	printf ("impossible d'ajouter la requete %d à l'imprimante %d : file d'attente pleine\n", req, imp);
      }
      break;
    case 'e':
      choix_imprimante(&imp);
      retour = extraire (&req, imp);
      if (!retour) {
	printf ("requete %d extraite de l'imprimante %d\n", req, imp);
      }
      else {
	printf ("pas requete en attente pour l'imprimante %d\n", imp);
      }
      break;
    case 'c':
      choix_imprimante(&imp);
      retour = consulter (&req, imp);
      if (!retour) {
	printf ("la prochaine requete executee par l'imprimante %d est la %d\n", imp, req);
      }
      else {
	printf ("pas requete en attente pour l'imprimante %d\n", imp);
      }
      break;
    case 'p':
      printf ("fonction indisponible pour le moment\n");
      break;
    case 'q':
      break;
    default: printf ("%c n'est pas une action possible\n", cde);
  }
}

int main()
{
  char cde;

  demarrage();

  do {
    choix_action(&cde);
    execution_action(cde);
  }
  while (cde != 'q'); 
}
