import java.util.*;
import java.io.*;

/**
 * Article vendu dans le magasin
 * L'article peut être un lot d'articles
 *
 * @see Classe Lot
 * @author Richard Grin
 * @version 1.0 10/10/97
 */

public class Article implements Serializable {
  private String reference;
  private String nom;
  private String marque;
  /** prix unitaire */
  private float pu;
  /**
   * Contient les articles référencés
   * Une clé est une référence d'article
   * Elle référence un article
   */
  private static Hashtable articles = new Hashtable();

  /**
   * Crée un article et l'ajoute dans la liste des articles.
   * Les articles ne seront alors plus désignés que par leur référence,
   * en particulier pour modifier leurs caractéristiques.
   */
  public Article(final String uneReference, final String unNom,
                 final String uneMarque, final float unPu)
    throws RefDoubleException {
    reference = uneReference;
    nom = unNom;
    marque = uneMarque;
    pu = unPu;
    ajoute();
  }

  /*
   * Ajoute un article à la liste autorisée des articles
   * On vérifie que la référence n'est pas déjà attribuée à un autre article
   */
  private void ajoute() throws RefDoubleException {
    if (articles.containsKey(reference))
      throw new RefDoubleException(reference);
    else
      articles.put(reference, this);
  }

  public String getReference() {
    return reference;
  }

  public String getNom() {
    return nom;
  }

  /** Retourne la marque de l'objet */
  public String getMarque() {
    return marque;
  }

  public float getPu() { // sera redéfini par Lot
    return pu;
  }

  public String toString() {
    return "Réf. " + reference + " Nom :" + nom + " (" + marque + ") "
           + "PU : " + pu;
  }

  public String decritToi() { // Comme toString en + agréable (mais - complet)
    return nom + " " + marque;
  }

  /**
   * Donne un article à partir de sa référence.
   * Ce sera la seule façon de récupérer un article.
   * Renvoie null si aucun article n'a cette référence.
   */
  public static Article getArticle(final String uneRefArticle)
           throws RefExistePasException {
    Article article = (Article)articles.get(uneRefArticle);
    if (article == null)
      throw new RefExistePasException(uneRefArticle);
    else
      return article;
  }

  /** Enregistre tous les articles dans le fichier */
  public static void enregistreArticles(File fichier)
      throws IOException {
    FileOutputStream fos = new FileOutputStream(fichier);
    ObjectOutputStream oos = new ObjectOutputStream(fos);
    oos.writeObject(articles);
    oos.close();
  }

  public static void litArticles(File fichier)
      throws IOException, RefExistePasException,
             RefDoubleException, ClassNotFoundException {
    FileInputStream fis = new FileInputStream(fichier);
    ObjectInputStream ois = new ObjectInputStream(fis);
    articles = (Hashtable)ois.readObject();
  }

  /** Donne tous les articles */
  public static Enumeration articles() {
    return articles.elements();
  }

  /** Donne toutes les références d'articles */
  public static Enumeration refArticles() {
    return articles.keys();
  }

  /**
   * Les méthodes suivantes modifient les caractéristiques
   * d'un article.
   * Impossible de modifier une référence.
   */
  public void setNom(final String unNom) {
    nom = unNom;
  }

  public void setMarque(final String uneMarque) {
    marque = uneMarque;
  }

  public void setPu(final float unPu) {
    pu = unPu;
  }
}

