//Capo: capo.cpp
// Definisce: Capo, Cintura, Vestiario
#include <stdio.h>
#include "capo.h"

/******************************************************/
/* Classe Capo                                        */
/******************************************************/

/* Confronta questo con un altro */
int Capo::compare (Vestiario *c)
{
  if (Genere.compare (c -> Genere))      // Se non sono dello stesso genere
    return -1;                           // Ritorna 'no'
  return Modello.compare (c -> Modello); // Altrimenti confronta anche il modello
}

int Capo::compare (Capo* l)
{
  while (l)
  {
    if (compare ((Vestiario*) l) && Next ())
      l = (Capo*) l -> Next ();
    else
      return 0; 
  }
  return -1;
}

int Capo::compare (AttrList *l)
{
  if (l->compare (Genere))               // Confronta il modello con la lista
    return -1;                           // Se il modello non corrisponde, ritorna 'no'
  return l->compare (Modello);           // Altrimenti confronta anche il modello
}

void Capo::Pausa (int num)
{
  if ((num%24) == 0)                         // Se il numero corrente (la riga) e' divisibile per 24
  {
    printf ("Premi A-Capo per continuare");  // Stampa un prompt
    getchar ();                              // Ed attende un carattere
  }
}

void Capo::show (int num)
{
  Pausa (num);                                         // controlla se fermarsi
  printf ("%2d |%-30s|%-30s|%3s|\n",num,Genere.val (), // stampa la linea
    Modello.val (),"");
  if (Next ())                                         // se c'e' un nuovo capo
    ((Capo*)Next ()) -> show (num + 1);                // continua la stampa
}

/******************************************************/
/* Classe Cintura                                     */
/******************************************************/

int Cintura::compare (Vestiario *c)
{
  if (Capo::compare (c))               // richiede il confronto alla superclasse
    return -1;                         // se non corrisponde, ritorna 'no'
  return Taglia.compare (c -> Taglia); // altrimenti confronta anche la taglia
}

int Cintura::compare (AttrList *l)
{
  if (Capo::compare (l))      // richiede il confronto alla superclasse
    return -1;                // se non corrisponde, ritorna 'no'
  return l->compare (Taglia); // altrimenti confronta anche la taglia
}

void Cintura::show (int num)  // identica a quella della superclasse, ma stampa tutti gli attributi
{
  Pausa (num);
  printf ("%2d |%-30s|%-30s|%3s|\n",num,Genere.val (),
    Modello.val (),Taglia.val ());
  if (Next ())
  ((Capo*)Next ()) -> show (num + 1);
}

/******************************************************/
/* Classe Vestiario                                   */
/******************************************************/

int Vestiario::compare (Vestiario *c)
{
  if (Cintura::compare (c))            // richiede il confronto alla superclasse
    return -1;                         // se non corrisponde, ritorna 'no'
  return Colore.compare (c -> Colore); // altrimenti confronta anche la taglia
}

int Vestiario::compare (AttrList *l)
{
  if (Cintura::compare (l))   // richiede il confronto alla superclasse
    return -1;                // se non corrisponde, ritorna 'no'
  return l->compare (Colore); // altrimenti confronta anche il colore
}

void Vestiario::show (int num)  // identica a quella della superclasse, ma stampa tutti gli attributi
{
  Pausa (num);
  printf ("%2d |%-30s|%-30s|%3s|%s\n",num,Genere.val (),
    Modello.val (),Taglia.val (), Colore.val ());
  if (Next ())
    ((Capo*)Next ()) -> show (num + 1);
}