import java.io.*;
import fi.jyu.mit.ohj2.*;
import java.util.*;
/**
 * Kerhon jäsenistö joka osaa mm. lisätä uuden jäsenen
 *
 * @author Vesa Lappalainen
 * @version 1.0, 20.03.2003
 */
public class Harrastukset {
  private boolean muutettu = false;
  private String tiedoston_nimi = "";
  private String bak_nimi = "";
  private String koko_nimi = "";
  private Collection alkiot = new ArrayList();

  public Harrastukset() {  }

  /**
   * 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 harrastuksen tietorakenteeseen.  Ottaa harastuksen omistukseensa.
   * @param har lisätäävän jäsnen viite.  Huom tietorakenne muuttuu omistajaksi
   */
  public void lisaa(Harrastus har) {
    alkiot.add(har);
  }


  /**
   * 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 harrastusten lukumäärän
   * @return harrastusten lukumäärä
   */
  public int getLkm()                    { return alkiot.size();               }

  /**
   * 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;   }

  /**
   * Palauttaa iteraattorin jolla kaikki harrastukset voidaan käydä lävitse
   * @return iteraattori kaikkien läpikäymiseen
   */
  public Iterator iterator() {
    return alkiot.iterator();
  }

  /**
   * Iteraattori, jolla käydään lävitse tietyn henkilön harrastukset.
   * @author Vesa Lappalainen
   * @version 1.0, 20.03.2003
   */
  public class HarrastuksetIterator implements Iterator {
    private int jasenid;
    private Iterator iter = alkiot.iterator();
    private Harrastus seuraava = null;

    public HarrastuksetIterator(int jid) {
      jasenid = jid;
    }

    public boolean hasNext() {
      if ( seuraava != null ) return true;
      while ( true ) {
        if ( !iter.hasNext() ) return false;
        seuraava = (Harrastus)iter.next();
        if ( seuraava.getJasen_id()== jasenid ) return true;
        seuraava = null;
      }
    }

    public Object next() throws NoSuchElementException {
      if ( !hasNext() ) throw new NoSuchElementException("Ei oo");
      Harrastus pal = seuraava;
      seuraava = null;
      return pal;
    }

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

  }

  /**
   * Palauttaa iteraattorin jolla tietyn jäsenen harrastukset voidaan
   * käydä lävitse
   * @param jasen_id minkä jäsenen harrastukset iteroidaan
   * @return iteraattori valitun jäsenen harrastusten läpikäymiseen
   */
  public Iterator iterator(int jasen_id) {
    return new HarrastuksetIterator(jasen_id);
  }

  private static void testi(Object o) {
    Harrastus har = (Harrastus)o;
    System.out.print(har.getJasen_id() + " ");
    har.tulosta(System.out);
  }

  /**
   * Testiohjelma harrastuksille
   * @param args ei käytössä
   */
  public static void main(String args[]) {
    Harrastukset harrasteet = new Harrastukset();
    Harrastus pitsi1 = new Harrastus();
    pitsi1.vastaa_pitsin_nyplays(2);
    Harrastus pitsi2 = new Harrastus();
    pitsi2.vastaa_pitsin_nyplays(1);
    Harrastus pitsi3 = new Harrastus();
    pitsi3.vastaa_pitsin_nyplays(2);
    Harrastus pitsi4 = new Harrastus();
    pitsi4.vastaa_pitsin_nyplays(2);

    harrasteet.lisaa(pitsi1);
    harrasteet.lisaa(pitsi2);
    harrasteet.lisaa(pitsi3);
    harrasteet.lisaa(pitsi2);
    harrasteet.lisaa(pitsi4);

    System.out.println("============= Harrastukset testi =================");


    for (Iterator i=harrasteet.iterator(2); i.hasNext(); ) {
      testi(i.next());
    }
    { // Testataan toimiiko iteraattori ilman hasNextiä
      System.out.println("============= Iteraattori testi =================");
      Iterator i=harrasteet.iterator(2);
      System.out.println(i.hasNext() + " " + i.hasNext());
      testi(i.next());
      System.out.println(i.hasNext() + " " + i.hasNext());
      testi(i.next());
      System.out.println(i.hasNext() + " " + i.hasNext());
      testi(i.next());
      System.out.println(i.hasNext() + " " + i.hasNext());
      testi(i.next());
      System.out.println(i.hasNext() + " " + i.hasNext());
      testi(i.next());
      System.out.println(i.hasNext() + " " + i.hasNext());
      testi(i.next());
      System.out.println(i.hasNext() + " " + i.hasNext());
      testi(i.next());
      System.out.println(i.hasNext() + " " + i.hasNext());
      testi(i.next());
      System.out.println(i.hasNext() + " " + i.hasNext());
      testi(i.next());
      System.out.println(i.hasNext() + " " + i.hasNext());
      testi(i.next());
      System.out.println(i.hasNext() + " " + i.hasNext());
    }

  }

}