import java.io.*;
import java.util.*;
import fi.jyu.mit.ohj2.*;
/**
 * Kerhon jäsenistö joka osaa mm. lisätä uuden jäsenen
 *
 * @author Vesa Lappalainen
 * @version 1.0, 22.02.2003
 * @version 1.1, 20.03.2003
 */
public class Jasenet {
  private static final int MAX_JASENIA = 5;
  private int lkm = 0;
  private boolean muutettu = false;
  private String tiedoston_nimi = "";
  private String bak_nimi = "";
  private String koko_nimi = "";
  private Jasen alkiot[] = new Jasen[MAX_JASENIA];

  public Jasenet() {  }

  /**
   * Poikkeusluokka tietorakenteesta aiheutuville poikkeuksille.
   * @author Vesa Lappalainen
   * @version 1.0, 22.02.2003
   */
  public class SailoException extends Exception {
    public SailoException(String viesti) { super(viesti); }
  }

  /**
   * Lisää uuden jäsenen tietorakenteeseen.  Ottaa jäsenen omistukseensa.
   * @param jasen lisätäävän jäsnen viite.  Huom tietorakenne muuttuu omistajaksi
   * @throws SailoException jos tietorakennen on jo täynnä
   */
  public void lisaa(Jasen jasen) throws SailoException {
    if ( lkm >= alkiot.length ) throw new SailoException("Liikaa alkioita");
    alkiot[lkm] = jasen;
    lkm++;
  }


  /**
   * Palauttaa viitteen i:teen jäseneen.
   * @param i monennenko jäsenen viite halutaan
   * @return viite jäseneen, jonka indeksi on i
   * @throws SailoException jos i ei ole sallitulla alueella
   */
  public Jasen anna(int i) throws SailoException {
    if ( i < 0 || lkm <= i ) throw new SailoException("Laiton indeksi " + i);
    return alkiot[i];
  }





  /**
   * Lukee jäsenistön tiedostosta.  Kesken.
   * @param tied tiedoston nimen alkuosa
   * @throws SailoException jos lukeminen epäonnistuu
   */
  public void lue_tiedostosta(String tied) throws SailoException {
    tiedoston_nimi = tied + ".dat";
    koko_nimi = "Kelmien kerho";
  }

  /**
   * Tallentaa jäsenistön tiedostoon.  Kesken.
   * @throws SailoException jos talletus epäonnistuu
   */
  public void talleta() { }

  /**
   * Palauttaa Kerhon koko nimen
   * @return Kerhon koko nimi merkkijononna
   */
  public String getKoko_nimi()           { return koko_nimi;                   }

  /**
   * Palauttaa kerhon jäsenten lukumäärän
   * @return jäsenten lukumäärä
   */
  public int getLkm()                    { return lkm;                         }

  /**
   * Palauttaa tiedoston nimen, jota käytetään tallennukseen
   * @return tallennustiedoston nimi
   */
  public String getTiedoston_nimi()      { return tiedoston_nimi;              }

  /**
   * Palauttaa varakopiotiedoston nimen
   * @return varakopiotiedoston nimi
   */
  public String getBak_nimi()            { return bak_nimi;                    }

  /**
   * Tekee nykyisestä tiedostosta varakopiotiedoston. Kesken.
   * @param bak_tark tarkennin varakopioiedostoille
   * @return onnistuiko (true) vai ei (false)
   */
  public boolean TeeBak(String bak_tark) { bak_nimi = bak_tark; return true;   }

  /**
   * Iteraattorin implementointi.
   * @author Vesa Lappalainen
   * @version 1.0, 20.03.2003
   */
  public class JasenetIterator implements Iterator {
    private int kohdalla = -1;

    public boolean hasNext() {
//     if ( kohdalla + 1 >= lkm )  return false;
//     return true;
      return kohdalla + 1 < lkm;
    }

    public Object next() throws NoSuchElementException {
      if ( !hasNext() ) throw new NoSuchElementException("Ei oo");
      kohdalla++;
      return alkiot[kohdalla];
    }

    public void remove() throws UnsupportedOperationException {
      throw new UnsupportedOperationException("Me ei poisteta");
    }
  }

  /**
   * Palauttaa iteraattorin jolla kaikki jäsenet voidaan käydä lävitse
   * @return iteraattori kaikkien läpikäymiseen
   */
  public Iterator iterator() {
    return new JasenetIterator();
  }



  /**
   * Testiohjelma jäsenistölle
   * @param args ei käytössä
   */
  public static void main(String args[]) {
    Jasenet jasenet = new Jasenet();

    Jasen aku = new Jasen(), aku2 = new Jasen();
    aku.rekisteroi();    aku.vastaa_aku_ankka();
    aku2.rekisteroi();   aku2.vastaa_aku_ankka();

    try {
      jasenet.lisaa(aku);
      jasenet.lisaa(aku2);

      System.out.println("============= Jäsenet testi =================");

//      for (int i=0; i<jasenet.getLkm(); i++) {
      for (Iterator  i=jasenet.iterator(); i.hasNext(); ) {
//        Jasen jasen = jasenet.anna(i);
        Jasen jasen = (Jasen)i.next();
        System.out.println("Jäsen nro: " + i);
        jasen.tulosta(System.out);
      }

    } catch ( Jasenet.SailoException ex ) {
      System.out.println(ex.getMessage());
    }
  }

}