import java.util.*;

public class Commande implements Cloneable {
  private static int numCommandeSuivante = 1; // incrémenté automatiquement
  private int numCommande;
  private String client;
  private Vector lignesCommande;

  public Commande () {
    numCommande = numCommandeSuivante++;
    client = null;
    lignesCommande = new Vector();
  }

  public Commande (String unClient) {
    this();
    client = unClient;
  }

  public int getNumCommande() {
    return numCommande;
  }

  public String getClient() {
    return client;
  }

  public void setClient(String unClient) {
    client = unClient;
  }

  public void ajouterLigneCommande(LigneCommande uneLigne) {
    lignesCommande.addElement(uneLigne);
  }

  public void ajouterLigneCommande(Article unArticle,
                                   float uneQuantite) {
    lignesCommande.addElement(
               new LigneCommande(unArticle, uneQuantite));
  }

  /** Remplace la ligne de commande numéro unNumeroLigne
      par la ligne uneNouvelleLigne */
  public void remplacerLigneCommande(
                  LigneCommande uneNouvelleLigne, int unNumeroLigne) {
    lignesCommande.setElementAt(uneNouvelleLigne, unNumeroLigne);
  }

  /** Enlève la ligne numéro unNumeroLigne */
  public void enleverLigneCommande(int unNumeroLigne) {
    lignesCommande.removeElementAt(unNumeroLigne);
  }

  /** Enlève la 1ère ligne qui concerne l'article
      (renvoie true si l'élément est trouvé et false sinon) */
  public boolean enleverLigneCommande(Article unArticle) {
    return lignesCommande.removeElement(unArticle);
  }

  /** Renvoie une Enumeration des lignes de la commande */
  public Enumeration lignesCommande() {
    return new EnumereLignesCommande(); // classe définie ci-dessous
  }

  public float prixTotal() {
    LigneCommande ligne;
    float prix = 0;
    Enumeration e = lignesCommande.elements();
    while (e.hasMoreElements()) {
      ligne = (LigneCommande) e.nextElement();
      prix += (float) (ligne.getQuantite() *
                       ligne.getArticle().getPu());
    }
    return prix;
  }

  public String toString() {
    String affich = "Numéro " + numCommande
                    + " ; Client : " + client + "\n";
    LigneCommande ligne;
    Enumeration e = lignesCommande.elements();
    while (e.hasMoreElements()) {
      affich += ((LigneCommande) e.nextElement()).toString() + "\n";
    }
    affich += "\nPrix Total : " + new Float(prixTotal()).toString();
    return affich;
  }

  /** Renvoie la ligne de commande numéro unNumeroLigne */
  public LigneCommande ligneNumero(int unNumeroLigne) {
    return (LigneCommande)lignesCommande.elementAt(unNumeroLigne);
  }

  /** Enregistre la facture dans le fichier
  public void enregistrerFichier(File fichier) { */


  public Object clone() throws CloneNotSupportedException {
    Commande nouvCommande = (Commande)super.clone();
    nouvCommande.lignesCommande =
          (Vector)lignesCommande.clone();
    return nouvCommande;
  }

  class EnumereLignesCommande implements Enumeration {
    private int numLigne; // ligne courante

    EnumereLignesCommande() {
      numLigne = 0;
    }

    public boolean hasMoreElements() {
      return (numLigne < lignesCommande.size());
    }

    public Object nextElement() {
      if (hasMoreElements())
        return ligneNumero(numLigne++);
      else
        return null;
    }
  }

}

