//Commesso: commesso.cpp
#include <iostream.h>
#include <strstream.h>
#include <iomanip.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
    cout << "Nessun capo scelto" << endl;   // Dice che non ce ne sono
  cout << "Premi <a capo> per continuare";  // Pausa...
  cin.ignore (10,'\n');                     // Arriva fino all' 'a capo'
}

void Commesso::ListaDisponibili ()
{
  if (scelti)                                  // Se ci sono capi in lista
    scelti -> show (1);                        // Li mostra
  else                                         // Altrimenti
    cout << "Nessun capo disponibile" << endl; // Dice che non ce ne sono
  cout << "Premi <a capo> per continuare";  // Pausa...
  cin.ignore (10,'\n');                     // Arriva fino all' 'a capo'
}

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 ()
{
int i;Capo *c;
  if (scelti)                           // Se esiste una lista di scelti
  {
    cout << "Scegli un capo: ";         // Stampa il prompt
    cin >> i;                           // Legge la scelta
    cin.ignore (10,'\n');               // Arriva fino all' 'a capo'
    c = (*scelti) [i];                  // Ottiene l'elemento scelto
    if (c)                              // Se l'ha trovato
    {
      c -> remove (scelti);             // Lo elimena dalla lista degli scelti
      *c += comprati;                   // Somma i comprati all'elemento
      comprati = c;                     // E mette l'elemento come primo dei comprati
      cout << "Capo spostato" << endl;
    }
  }
  else
    cout << "Nessun capo disponibile" << endl;
}


void Commesso::ToDisponibili ()
{
int i;Capo *c;
  if (comprati)                          // Se esiste una lista di comprati
  {
    cout << "Capo da scartare: ";        // Stampa il prompt
    // scanf ("%d\n",&i);
    cin >> i;                            // Legge la scelta
    cin.ignore (10,'\n');                // Arriva fino all' 'a capo'
    c = (*comprati) [i];                 // Individua l'elemento
    if (c)                               // Se l'ha individuato
    {
      c -> remove (comprati);            // Lo rimuove dalla lista dei comprati
      *c += scelti;                      // Aggiunge la lista degli scelti dopo l'elemento
      scelti = c;                        // E rende l'elemento il primo degli scelti
      cout << "Capo spostato" << endl;
    }
  }
  else
    cout << "Nessun capo scelto" << endl;
}


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;
  }
  cout << "Introduci " << nome << " :";  // Stampa il prompt
  cin.width (len);
  cin >> buf;                            // Legge il dato, rispettando la lunghezza
  if (t == AttrList::taglia)             // Se ho letto una taglia
  {
  int i;
    istrstream istr(buf,4);                       // Crea un 'istrstream' con la nostra stringa
    istr >> i;                                    // Estrae dalla stringa l'inero
    buf [0] = 0;                                  // Tronca la stringa
    ostrstream ostr (buf,4);                      // Costruisce un 'ostrstream' con la stringa, lungo 4
    ostr << setw (3) << setfill ('0') << i % 999; // Formatta il numero a tre cifre con gli zeri
  }
  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);
}