// File: Sportello.java
// Time-stamp: "2003-03-18 17:57:28 calvanes"
// Scopo: Sportello: soluzione domanda 2

public class Sportello {

  private static final int DIMINIZ = 10; //dimensione iniziale dell'array

  private Prenotazione[] prenotazioni;
  private int numOrdine;
  private int numPrenotazioni;

  //metodi pubblici
  public Sportello () {
    prenotazioni = new Prenotazione[DIMINIZ] ;
    numOrdine = 0;
    numPrenotazioni = 0;
  }

  public int prenota(String nome) {
    if (numPrenotazioni == prenotazioni.length) {
      //ingrandisci l'array
      Prenotazione[] aux = new Prenotazione[prenotazioni.length*2];
                                                // Crea array aux piu' grande.
      for(int i = 0; i < numPrenotazioni; i++)  // Copiaci gli elementi
        aux[i] = prenotazioni[i];               // dell'array originale.
      prenotazioni = aux;      // Sostituisci nuovo array all'array originale.
    }

    // nell'array c'e' spazio per la nuova prenotazione
    prenotazioni[numPrenotazioni] = new Prenotazione(nome, numOrdine);
    numPrenotazioni++;
    numOrdine++;
    return numOrdine-1;
  }

  public Prenotazione estrai() throws EccezioneSportello {
    if (numPrenotazioni == 0)
      throw new EccezioneSportello("Errore: coda di prenotazioni vuota");
    else {
      Prenotazione p = prenotazioni[0];
      // sposta indietro di una posizione 
      // tutti gli elementi dell'array successivi al primo
      for(int i = 0; i < numPrenotazioni-1; i++)
        prenotazioni[i] = prenotazioni[i+1];
      prenotazioni[numPrenotazioni-1] = null;
      numPrenotazioni--;

      // se array troppo vuoto, rimpiccioliscilo
      if (numPrenotazioni < prenotazioni.length/4) {
        int nuovaDim = (DIMINIZ > numPrenotazioni*2)?
                          DIMINIZ : numPrenotazioni*2;
        Prenotazione[] aux = new Prenotazione[nuovaDim];
        for(int i = 0; i < numPrenotazioni; i++)
          aux[i] = prenotazioni[i];
        prenotazioni = aux;
      }
      return p;
    }
  }

  public void rinuncia(int numero) throws EccezioneSportello {
    // trova la possibile posizione della prenotazione
    int k = 0;
    while (k < numPrenotazioni && prenotazioni[k].numero() != numero)
      k++;

    if (k < numPrenotazioni && prenotazioni[k].numero() == numero) {
      // sposta indietro di una posizione 
      // tutti gli elementi dell'array dalla pos k in poi 
      for(int i = k; i < numPrenotazioni-1; i++)
        prenotazioni[i] = prenotazioni[i+1];
      prenotazioni[numPrenotazioni-1] = null;
      numPrenotazioni--;

      // se array troppo vuoto, rimpiccioliscilo
      if (numPrenotazioni < prenotazioni.length/4) {
        int nuovaDim = (DIMINIZ > numPrenotazioni*2)?
                          DIMINIZ : numPrenotazioni*2;
        Prenotazione[] aux = new Prenotazione[nuovaDim];
        for(int i = 0; i < numPrenotazioni; i++)
          aux[i] = prenotazioni[i];
        prenotazioni = aux;
      }
    } else
      throw new EccezioneSportello("Errore: prenotazione inesistente");
  }

  public int tempoAttesa(int numero) throws EccezioneSportello {
    // trova la possibile posizione della prenotazione
    int k = 0;
    while (k < numPrenotazioni && prenotazioni[k].numero() != numero)
      k++;
    if (k < numPrenotazioni && prenotazioni[k].numero() == numero)
      return k;
    else
      throw new EccezioneSportello("Errore: prenotazione inesistente");
  }

  public String toString() {
    String ris = "";
    for (int i = 0; i < numPrenotazioni; i++)
      ris = ris + prenotazioni[i] + "\n";
    return ris;
  }
}
