//Commesso: commesso.cpp
#include <stdio.h>
#include <stdlib.h>
#include "commesso.h"

/******************************************************/
/* Classe Commesso                                    */
/******************************************************/

void Commesso::Scegli (CapoScelto scelto)
{
int HaTaglia = 0; // Nessuna taglia
int HaColore = 0; // Nessun colore
int i;
menu *m = 0;      // Il menu' che ci serve
  switch (scelto)
  {
    case Maglione :
      HaTaglia = -1; // Maglione ha taglia
      HaColore = -1; // Maglione ha colore
      new AttrList (&criteri,AttrList::eq,AttrList::genere,"Maglione");
      break;
    case Camicia :
      HaTaglia = -1; // Camicia ha taglia
      HaColore = -1; // Camicia ha colore
      new AttrList (&criteri,AttrList::eq,AttrList::genere,"Camicia");
      break;
    case Pantaloni :
      HaTaglia = -1; // Pantaloni hanno taglia
      HaColore = -1; // Pantaloni hanno colore
      new AttrList (&criteri,AttrList::eq,AttrList::genere,"Pantaloni");
      break;
    case Cintura :
      HaTaglia = -1; // Cintura ha taglia
      new AttrList (&criteri,AttrList::eq,AttrList::genere,"Cintura");
      break;
    case Cravatta :
      new AttrList (&criteri,AttrList::eq,AttrList::genere,"Cravatta");
      break;
  }

  // Adesso crea il menu per i dati aggiuntivi del capo (se ne voglio)
  new MenuModello (&m, "Modello");  // Sicuramente un modello
  if (HaTaglia) // Se il capo ha la taglia, introduce i tre confronti
  {
    new MenuTagliaPiu (&m, "Taglia maggiore o uguale a");
    new MenuTagliaMeno (&m, "Taglia minore o uguale a");
    new MenuTaglia (&m, "Taglia uguale a");
  }
  if (HaColore) // Se il capo ha un colore, menu per inserire il colore
    new MenuColore (&m, "Colore");
  new MenuCerca (&m, "Cerca");  // Menu' 'cerca', che avvia la ricerca

  // Loop di esecuzione del menu', finche' non si sceglie 'Cerca' (voce 1)
  do {
    i = m->print (1);
    m->doaction (i,this);
  } while (i != 1);

  delete m;	// Elimina il menu della scelta

  // Menu per la scelta tra i capi estratti dal magazzino
  m = 0;        // Inizializza a 0 il puntatore, per creare un altro menu
  new MenuVediScelti (&m, "Guarda Scelti");
  new MenuVediDisponibili (&m, "Guarda Disponibili");
  new MenuScegli (&m, "Scegli Capo");
  new MenuScarta (&m, "Scarta Capo");
  new MenuCompra (&m, "Compra");
  // Loop che esegue il menu' fintantoche non si sceglie la voce 'Compra' (1)
  do {
    i = m->print (1);
    m->doaction (i,this);
  } while (i != 1);

  delete m;   // Elimina il menu' della scelta
}

void Commesso::Cerca ()
{
  scelti = mag -> Select (criteri);  // Dati i criteri, controlla il magazzino
}

void Commesso::ListaScelti ()
{
  if (comprati)                             // Se ci sono capi in lista
    comprati -> show (1);                   // Li mostra
  else                                      // Altrimenti
    printf ("Nessun capo scelto\n");        // Dice che non ce ne sono
  printf ("Premi <a capo> per continuare"); // Pausa...
  getchar ();
}

void Commesso::ListaDisponibili ()
{
  if (scelti)                               // Se ci sono capi in lista
    scelti -> show (1);                     // Li mostra
  else                                      // Altrimenti
    printf ("Nessun capo disponibile\n");   // Dice che non ce ne sono
  printf ("Premi <a capo> per continuare"); // Pausa...
  getchar ();
}

void Commesso::Compra ()
{
  if (scelti)             // Se ci sono capi non comprati
    mag -> Add (scelti);  // Li rimette in magazzino
  if (comprati)           // Se ci sono capi comprati
    delete comprati;      // Li 'depenna'
}

void Commesso::ToScelti ()
{
char str [10];
int i;Capo *c;
  if (scelti)                           // Se esiste una lista di scelti
  {
    printf ("Fai la tua scelta: ");     // Stampa il prompt
    // scanf ("%d\n",&i);
    fgets (str,9,stdin);                // Legge la scelta
    i = strtol (str,0,0L);              // La trasforma in numero
    c = (Capo*) scelti -> index (i,1);  // Ottiene l'elemento scelto
    if (c)                              // Se l'ha trovato
    {
      c -> remove ((list **) &scelti);  // Lo elimena dalla lista degli scelti
      c -> append (comprati);           // Appende i comprati all'elemento
      comprati = c;                     // E mette l'elemento come primo dei comprati
      printf ("Capo spostato\n");
    }
  }
  else
    printf ("Nessun capo disponibile\n");
}


void Commesso::ToDisponibili ()
{
char str [10];
int i;Capo *c;
  if (comprati)                          // Se esiste una lista di comprati
  {
    printf ("Capo da scartare: ");       // Stampa il prompt
    // scanf ("%d\n",&i);
    fgets (str,9,stdin);                 // Legge la risposta  
    i = strtol (str,0,0L);               // Trasforma in numero
    c = (Capo*) comprati -> index (i,1); // Individua l'elemento
    if (c)                               // Se l'ha individuato
    {
      c -> remove ((list **) &comprati); // Lo rimuove dalla lista dei comprati
      c -> append (scelti);              // Aggiunge la lista degli scelti dopo l'elemento
      scelti = c;                        // E rende l'elemento il primo degli scelti
      printf ("Capo spostato\n");
    }
  }
  else
    printf ("Nessun capo scelto\n");
}


void Commesso::AddCriterio (AttrList::modo m, AttrList::tipo_t t)
{
char buf [30];
char *nome;
int len;
  switch (t)
  {
    case AttrList::taglia :  // Se deve aggiungere una 'taglia'
      nome = "taglia";       // Il prompt e' 'taglia'
      len=4;                 // Deve leggere max 4 caratteri
      break;
    case AttrList::colore :  // Se deve leggere un 'colore'
      nome = "colore";       // Il prompt e' 'colore'
      len=19;                // E sara' lungo 19 caratteri al massimo
      break;
    case AttrList::modello : // Se invece deve leggere il modello
      nome = "modello";      // Il prompt sara' 'modello'
      len=29;                // E potra' essere lungo al massimo 29 caratteri
      break;
  }
  printf ("Introduci %s :",nome);  // Stampa il prompt
  fgets (buf,len,stdin);           // Legge il dato, rispettando la lunghezza
  buf [len] = 0;                   // Tronca la stgringa
  if (t == AttrList::taglia)       // Se ho letto una taglia
  {
  int i;
    i = strtol (buf,0,0L);         // Converto il valore in intero
    sprintf (buf,"%03d",i);        // E lometto in una stringa di tre cifre
  }
  new AttrList (&criteri,m,t,buf); // Creo il nuovo attributo, con il tipo ed il valore dato
}

/******************************************************/
/* Classe MenuCommesso                                */
/******************************************************/

void MenuCommesso::action (void *par)
{
Commesso c ((Magazzino *)par);
menu *mc = 0;
int i;

	new MenuAMaglione (&mc,"Maglione");
	new MenuACamicia (&mc,"Camicia");
	new MenuAPantaloni (&mc,"Pantaloni");
	new MenuACintura (&mc,"Cintura");
	new MenuACravatta (&mc,"Cravatta");

   i = mc->print (1);
   mc->doaction (i,&c);

   delete mc;	// Elimina il menu
}

/******************************************************/
/* Classe MenuCamicia                                 */
/******************************************************/

void MenuACamicia::action (void *par)
{
  ((Commesso *) par) -> Scegli (Commesso::Camicia);
}

/******************************************************/
/* Classe MenuAMaglione                               */
/******************************************************/

void MenuAMaglione::action (void *par)
{
  ((Commesso *) par) -> Scegli (Commesso::Maglione);
}

/******************************************************/
/* Classe MenuAPantaloni                              */
/******************************************************/

void MenuAPantaloni::action (void *par)
{
  ((Commesso *) par) -> Scegli (Commesso::Pantaloni);
}

/******************************************************/
/* Classe MenuACintura                                */
/******************************************************/

void MenuACintura::action (void *par)
{
  ((Commesso *) par) -> Scegli (Commesso::Cintura);
}

/******************************************************/
/* Classe MenuACravatta                               */
/******************************************************/

void MenuACravatta::action (void *par)
{
  ((Commesso *) par) -> Scegli (Commesso::Cravatta);
}

/******************************************************/
/* Classe MenuScegli                                  */
/******************************************************/

void MenuScegli::action (void *par)
{
  ((Commesso *) par) -> ToScelti ();
}

/******************************************************/
/* Classe MenuVediScelti                              */
/******************************************************/

void MenuVediScelti::action (void *par)
{
  ((Commesso *) par) -> ListaScelti ();
}

/******************************************************/
/* Classe MenuVediDisponibili                         */
/******************************************************/

void MenuVediDisponibili::action (void *par)
{
  ((Commesso *) par) -> ListaDisponibili ();
}

/******************************************************/
/* Classe MenuVediDisponibili                         */
/******************************************************/

void MenuScarta::action (void *par)
{
  ((Commesso *) par) -> ToDisponibili ();
}

/******************************************************/
/* Classe MenuCompra                                  */
/******************************************************/

void MenuCompra::action (void *par)
{
  ((Commesso *) par) -> Compra ();
}

/******************************************************/
/* Classe MenuCerca                                   */
/******************************************************/

void MenuCerca::action (void *par)
{
  ((Commesso *) par) -> Cerca ();
}

/******************************************************/
/* Classe MenuModello                                 */
/******************************************************/

void MenuModello::action (void *par)
{
  ((Commesso *) par) -> AddCriterio (AttrList::eq, AttrList::modello);
}

/******************************************************/
/* Classe MenuTagliaPiu                               */
/******************************************************/

void MenuTagliaPiu::action (void *par)
{
  ((Commesso *) par) -> AddCriterio (AttrList::ge, AttrList::taglia);
}

/******************************************************/
/* Classe MenuTagliaMeno                              */
/******************************************************/

void MenuTagliaMeno::action (void *par)
{
  ((Commesso *) par) -> AddCriterio (AttrList::le, AttrList::taglia);
}

/******************************************************/
/* Classe MenuTaglia                                  */
/******************************************************/

void MenuTaglia::action (void *par)
{
  ((Commesso *) par) -> AddCriterio (AttrList::eq, AttrList::taglia);
}

/******************************************************/
/* Classe MenuColore                                  */
/******************************************************/

void MenuColore::action (void *par)
{
  ((Commesso *) par) -> AddCriterio (AttrList::eq, AttrList::colore);
}