//Corriere: corriere.cc
#include <iostream.h>
#include <stdlib.h>
#include "corriere.h"

/* I metodi seguenti sono tutti concettualmente uguali:
 * - Richiedono gli attributi per un particolare capo di
 *   vestiario.
 * - Chiedono il numero di capi da inserire
 * - Creano tanti capi con gli attributi indicati, quanti
 *   ne sono richiesti, aggiungendoli alla lista del corriere
 */
void Corriere::AddCravatta ()
{
char Modello [30];
int i,n;
  cout << "Aggiungo Cravatta\nModello :";
  cin.width (29);                          // Limita la stringa a 29 caratteri
  cin >> Modello;
  cout << "Quantita' :";
  cin >> i;
  cin.ignore (10,'\n');                    // Arriva fino all' 'a capo'
  for (n = 0; n < i; n ++)
    new Capo (cons,"Cravatta",Modello);
}

void Corriere::AddCintura ()
{
char Modello [30];
char Taglia [10];
int i,n;
  cout << "Aggiungo Cintura\nModello :";
  cin.width (29);                          // Limita la stringa a 29 caratteri
  cin >> Modello;
  cout << "Taglia :";
  cin.width (9);                           // Limita la stringa a 9 caratteri
  cin >> Taglia;
  cout << "Quantita' :";
  cin >> i;
  cin.ignore (10,'\n');                    // Arriva fino all' 'a capo'
  for (n = 0; n < i; n ++)
    new Cintura (cons,"Cintura",Modello,strtol (Taglia,0,0L));
}

void Corriere::AddVestiario (char *capo)
{
char Modello [30];
char Taglia [10];
char Colore [20];
char num [10];
int i,n;
  cout << "Aggiungo " << capo << endl << "Modello :";
  cin.width (29);                          // Limita la stringa a 29 caratteri
  cin >> Modello;
  cout << "Taglia :";
  cin.width (9);                           // Limita la stringa a 9 caratteri
  cin >> Taglia;
  cout << "Colore :";
  cin.width (19);                          // Limita la stringa a 19 caratteri
  cin >> Colore;
  cout << "Quantita' :";
  cin >> i;
  cin.ignore (10,'\n');                    // Arriva fino all' 'a capo'
  for (n = 0; n < i; n ++)
    new Vestiario (cons,capo,Modello,strtol (Taglia,0,0L),Colore);
}

/* Finalmente, completata la lista del corriere,
 * aggiunge i capi 'arrivati' a quelli presenti in magazzino
 */
void Corriere::Inserisci ()
{
  mag -> Add (cons);
}

/* Adesso ci sono tutte le 'action' delle varie voci del menu */

/* Menu' principale del corriere. */
void MenuCorriere::action (void *par)
{
Corriere c ((Magazzino *)par);
menu *mc = 0;
int i;

  /* Crea le voci del menu' */
  new MenuMaglione (mc,"Maglione");
  new MenuCamicia (mc,"Camicia");
  new MenuPantaloni (mc,"Pantaloni");
  new MenuCintura (mc,"Cintura");
  new MenuCravatta (mc,"Cravatta");
  new MenuInserisci (mc,"Carica in magazzino");

  /* Esegue il menu' finche' non viene scelto 'Carica in Magazzino' */
  do {
    i = mc->print (1);
    mc->doaction (i,&c);
  } while (i != 1);

  delete mc;	// Elimina il menu
}

/* Le seguenti 'action' non fanno altro che invocare i metodi del corriere */
void MenuMaglione::action (void *par)
{
  ((Corriere *)par) -> AddVestiario ("Maglione");
}

void MenuCamicia::action (void *par)
{
  ((Corriere *)par) -> AddVestiario ("Camicia");
}

void MenuPantaloni::action (void *par)
{
  ((Corriere *)par) -> AddVestiario ("Pantaloni");
}

void MenuCintura::action (void *par)
{
  ((Corriere *)par) -> AddCintura ();
}

void MenuCravatta::action (void *par)
{
  ((Corriere *)par) -> AddCravatta ();
}

void MenuInserisci::action (void *par)
{
  ((Corriere *)par) -> Inserisci ();
}