import java.io.*;
import fi.jyu.mit.ohj2.*;

/**
 * Käyttöliittymäluokka Kerho-ohjelmaan
 * Kerho-ohjelman menujen testaus.  Varsinaiset toiminnot puuttuvat.<br>
 * Tarvitsee avukseen JAR-paketin:
 * <a href="http://www.mit.jyu.fi/vesal/kurssit/ohj2/ali/Ali.jar">Ali.jar</a><br>
 * Aliohjelmien dokumentaatio on:
 * <a href="http://www.mit.jyu.fi/vesal/kurssit/ohj2/ali/index.html">\kurssit\ohj2\ali</a><br>
 * <br>
 *
 * Lisätty tietorakenteen käyttö jäsenistön osalta.
 * Harrastusten käsittely puuttuu
 *
 * @author  Vesa Lappalainen
 * @version 1.0, 09.02.2003
 * @version 1.1, 23.02.2003
 */
public class Naytto {

  /**
   * Viite kerhoon, jota tämä käyttöliittymä käyttää
   */
  private Kerho kerho;

  /**
   * Käyttöliittymän alustus.  Käyttöliittymälle PITÄÄ kerto mitä
   * Kerho se käsittelee.
   * @param kerho jota käsitellään
   * @throws Exception jos kerhoa ei ole tuotu parametrina
   */
  public Naytto(Kerho kerho) throws Exception {
    if ( kerho == null ) throw new Exception("Kerho täytyy antaa!");
    this.kerho = kerho;
  }

  /**
   * Apualiohjelma tulostamiseen
   * @param s tuolsettava merkkijono
   * @param printlf tulostetaanko (true) rivinvaihto vai ei (false)
   */
  private static void tulosta(String s, boolean printlf) {
    System.out.print(s);
    if ( printlf ) System.out.println();
  }

  /**
   * Apualiohjelma tulostamiseen
   * @param s
   */
  private static void tulosta(String s) {
    tulosta(s,true);
  }

  /**
   * Tulostaa n kappaletta tyhjiä rivejä
   * @param n tulostettavien tyhjien rivien lukumäärä
   */
  private static void tyhja(int n) {
    for (int i=0; i<n; i++) tulosta("");
  }

  /**
   * Tulostaa kirjaimen ja tekstin alleviivattuna sekä tyhjää ympärille.
   * <pre>
   * Kutsu: otsikko('1',"Kissa istuu puussa");
   * tulostaa:
   * --- 4 tyhjää riviä
   * 1. Kissa istuu puussa
   * =====================
   * --- 2 tyhjöö riviä
   * </pre>
   * @param kirjain alkuun tulostettava kirjain
   * @param teksti kirjaimen perään tulostettava. teksti
   */
  private static void otsikko(char kirjain, String teksti) {
    tyhja(4);
    tulosta("" + kirjain + ". " + teksti);
    tulosta(Mjonot.tayta("=",1+2+teksti.length()));
    tyhja(2);
  }

  /**
   * Tulostaa "Ei toimi vielä" ja jää odottamaan näppäimen painallusta
   */
  void ei_toimi()  {
    tulosta("Ei toimi vielä!");
    IO.odota_jotakin();
  }

  /**
   * Avustustoiminto
   * @param valinta kirjain jolla toiminto aktivoitiin
   */
  void avustus(char valinta) {
    otsikko(valinta, "Avustus");
    ei_toimi();
  }


  /**
   * Tulostaa jäsenen tiedot
   * @param os tietovirta johon tulostetaan
   * @param jasen tulostettava jäsen
   */
  private void tulosta(OutputStream os, final Jasen jasen) {
    jasen.tulosta(os);
  }


  /**
   * Kysyy jäsenen tiedot päätteeltä.  Toistaiseksi täyttää aina
   * Aku Ankan tiedot.
   * @param jasen jäsen johon tiedot täytetään
   */
  private void kysy_tiedot(Jasen jasen) {
    tulosta("Toistaiseksi osaan lisätä vain Aku Ankan");
    jasen.vastaa_aku_ankka();
  }


  /**
   * Uuden jäsenen lisäys
   * @param valinta kirjain jolla toiminto aktivoitiin
   */
  void lisaa_uusi_jasen(char valinta) {
    otsikko(valinta,"Uuden jäsenen lisäys");
    Jasen jasen = new Jasen();
    jasen.rekisteroi();
    kysy_tiedot(jasen);

    tulosta("Lisätäänkö");
    tulosta(System.out,jasen);
    tulosta(":",false);

    if ( !IO.kylla_vastaus() ) {
      kerho.poista(jasen.getTunnus_nro());
      return;
    }

    try {
      kerho.lisaa(jasen);
    } catch ( Jasenet.SailoException ex ) {
      tulosta(ex.getMessage());
      kerho.poista(jasen.getTunnus_nro());
    }
  }


  /**
   * Jäsenen tietojen etsiminen
   * @param valinta kirjain jolla toiminto aktivoitiin
   */
  void etsi_jasenen_tiedot(char valinta) {
    otsikko(valinta,"Etsi jäsenen tiedot");
    ei_toimi();
  }


  /**
   * Ohjelman tulosteet, pitäisi tulla alimenu
   * @param valinta kirjain jolla toiminto aktivoitiin
   */
  void tulosteet(char valinta) {
    otsikko(valinta,"Tulosteet");
    tulosta("Toimii toistaiseksi vain näytölle");
    tulosta("---------------------------------------------------------");

    for (int i=0; i<kerho.getJasenia(); i++) {
      Jasen jasen = kerho.anna_jasen(i);
      tulosta("Jäsen nro: " + i);
      tulosta(System.out,jasen);
      tulosta("");
    }

    tulosta("---------------------------------------------------------");
    IO.odota_jotakin();
  }


  /**
   * Tietojen korjailu
   * @param valinta kirjain jolla toiminto aktivoitiin
   */
  void tietojen_korjailu(char valinta) {
    otsikko(valinta,"Tietojen korjailu");
    ei_toimi();
  }


  /**
   * Jäsenmaksujen päivitys
   * @param valinta kirjain jolla toiminto aktivoitiin
   */
  void paivita_jasenmaksuja(char valinta) {
    otsikko(valinta,"Päivitä jäsenmaksuja");
    ei_toimi();
  }


  /**
   * Tulostaa ohjelman päämenun
   */
  public void paamenu() {
    tulosta("\n\n\n\n");
    tulosta("Jäsenrekisteri");
    tulosta("==============");
    tulosta("");
    tulosta("Kerhossa " + kerho.getNimi()+ " on " +
             kerho.getJasenia() + " jäsentä.");
    tulosta("");
    tulosta("Valitse:");
    tulosta("   ?  = avustus");
    tulosta("   0  = lopetus");
    tulosta("   1  = lisää uusi jäsen");
    tulosta("   2  = etsi jäsenen tiedot");
    tulosta("   3  = tulosteet");
    tulosta("   4  = tietojen korjailu");
    tulosta("   5  = päivitä jäsenmaksuja");
    tulosta("   :",false);
  }

  /**
   * Silmukka jossa odotetaan näppäintä ja suoritetaan vastaava toiminto.
   * 0:n painaminen lopettaa silmukan ja palaa kutsuvaan ohjelmaan.
   * @return palauttaa 0 jos kaikki meni hyvin, 1 jos tuli virhe
   */
  int paavalinta() {
    char nappain;

    while ( true ) {

      paamenu();

      nappain = IO.odota_nappain("?012345",IO.EI_OLETUSTA,IO.MERKKI_ISOKSI);

      switch (nappain) {
        case '?': avustus(nappain);                break;
        case '0': return 0;
        case '1': lisaa_uusi_jasen(nappain);       break;
        case '2': etsi_jasenen_tiedot(nappain);    break;
        case '3': tulosteet(nappain);              break;
        case '4': tietojen_korjailu(nappain);      break;
        case '5': paivita_jasenmaksuja(nappain);   break;
        default : tulosta("Näin ei voi käydä!");  return 1;
      }

    }
  }

  /**
   * Tulostaa ohjelman logon
   */
  void logo() {
    tulosta("");
    tulosta("      ###################################");
    tulosta("      #   J Ä S E N R E K I S T E R I   #");
    tulosta("      #     versio 9.95                 #");
    tulosta("      #     Hannu Hanhi                 #");
    tulosta("      ###################################");
  }


  /**
   * Tulostaa ohjelman alkuohjeet
   */
  void ohjeet() {
    logo();
    tulosta("");
    tulosta("Tällä ohjelmalla ylläpidetään kerhon jäsenrekisteriä.");
  }


  /**
   * Tulostaa loppukiitokset
   */
  void kiitokset() {
    tulosta("");
    tulosta("KIITOS KÄYTÖSTÄ JA TERVETULOA UUDELLEEN");
    tulosta("");
    tulosta("");
  }


  /**
   * Lukee kerhon tiedot levyltä.  Kysyy ensin käyttäjältä tiedoson nimen.
   * @return palauttaa tyhjän merkkijonon jos kaikki menee hyvin, muuten
   * virhetekstin
   */
  String lue_kerho() {
    tulosta("Anna kerhon nimi>");
    ei_toimi();
    try {
      kerho.lue_tiedostosta("kelmit");
    } catch ( Jasenet.SailoException ex ) {
      System.out.println(ex.getMessage());
      return ex.getMessage();
    }

    return "";
  }


  /**
   * Tallentaa kerhon tiedot levylle.
   * @return palauttaa tyhjän merkkijonon jos kaikki menee hyvin, muuten
   * virhetekstin
   */
  String talleta_kerho() {
    logo();

    tulosta("");

    tulosta("Talletus...");
    ei_toimi();

    return "";
  }


  /**
   * Ohjelman pääohjelma
   * @param args komentorivin parametrit, ei käytössä vielä
   */
  public static void main(String[] args) {
    Kerho kerho = new Kerho();

    try {
      Naytto naytto = new Naytto(kerho);

      naytto.ohjeet();

      naytto.lue_kerho();

      naytto.paavalinta();

      naytto.talleta_kerho();

      naytto.kiitokset();
    }
    catch (Exception ex) {
      System.out.println("VIRHE: " + ex.getMessage());
    }
  }

}