//Magazzino: magaz.cpp
#include <iostream.h>
// #include <stdio.h>
#include "magaz.h"

/******************************************************/
/* Classe Magazzino                                   */
/******************************************************/

/* Metodo che aggiunge una lista di capi al magazzino */
void Magazzino::Add (Capo *add)
{
  if (add)        // Se passo una lista di capi (controllo su parametri)
  {
    *add += cont; // Mette il contenuto attuale in coda a quello che aggiungo
    cont = add;   // E mette la nuova lista come magazzino nuovo
  }               // In questo modo, se il magazzion e' vuoto' va lo stesso
}

/* Data una lista di criteri, confronta
 * ogni capo con la lista data.
 * Se corrisponde, guarda se ne ha gia'
 * 'scelto' uno uguale.
 * Se non c'e' gia', lo estrae dalla lista
 * del magazzino e la appende alla lista dei
 * capi scelti.
 * Per finire, restituisce la lista dei capi scelti */
Capo *Magazzino::Select (AttrList *criteri)
{
Capo *scelti = 0;                      // Inizialmente nessuno scelto
Capo *curr = cont;                     // elemento corrente = primo del magazzino
  while (curr)                         // Finche' ci sono elementi
  {
    if (*curr == criteri &&            // Se corrisponde ai criteri
      *curr != scelti)                 // e non e' gia' stato scelto
    {
    Capo *sel = curr;                  // Puntatore temporaneo all'elemento da spostare
      curr = curr -> Next ();          // Posiziona il 'corente' sul prossimo capo
      sel -> remove (cont);            // Elimina il capo scelto dal magazzino
      *sel += scelti;                  // Gli somma i capi gia' scelti
      scelti = sel;                    // E quindi ricostruisce la lista dei capi scelti
    }
    else
      curr = (Capo *) curr -> Next (); // Se non lo ha scelto, va qui' al prossimo
  }
  return scelti;                       // Ritorna la lista dei capi scelti
}

/* Stampa tutti gli elementi nella lista del magazzino */
void Magazzino::Inventario ()
{
  if (cont)           // Se la lista non e' vuota
    cont -> show (1); // Richiama il metodo 'show' di Capo (ricorsivo), a partire da 1
}

/******************************************************/
/* Classe Attributo                                   */
/******************************************************/

void MenuInventario::action (void *par)
{
  if (par)                                // Se viene richiamata correttamente
    ((Magazzino *) par) -> Inventario (); // Richiama la 'stampa inventario' del magazzino
  cout << "Premi A-Capo per continuare";  // Poi stampa un 'prompt'
  cin.ignore (10,'\n');                   // Ed attende un segno da parte dell'utente
}