import java.io.*;
import fi.jyu.mit.ohj2.*;
/**
 * Kerhon jäsen joka osaa mm. itse huolehtia tunnus_nro:staan.
 *
 * Muutokset:  02.04.2003, kenttien indeksointi<br>
 *
 * @author Vesa Lappalainen
 * @version 1.0, 22.02.2003
 * @version 1.3, 02.04.2003
 */
public class Jasen {
  private int tunnus_nro;                 // 0
  private String nimi             = "";   // 1
  private String hetu             = "";   // 2
  private String katuosoite       = "";
  private String postinumero      = "";
  private String postiosoite      = "";
  private String kotipuhelin      = "";
  private String tyopuhelin       = "";
  private String autopuhelin      = "";
  private int    liittymisvuosi   = 0;
  private double jmaksu           = 0;
  private double maksu            = 0;
  private String lisatietoja      = "";
  private static int seuraava_nro = 1;

  public Jasen() {  }

  public int getKenttia() { return 13; }
  public int ekaKentta()  { return 1;  }

  /**
   * Antaa k:n kentän sisällön merkkijonona
   * @param k monenenko kentän sisältö palautetaan
   * @return kentän sisältö merkkijonona
   */
  public String anna(int k) {
    switch ( k ) {
      case 0: return ""+tunnus_nro     ;
      case 1: return ""+nimi           ;
      case 2: return ""+hetu           ;
      case 3: return ""+katuosoite     ;
      case 4: return ""+postinumero    ;
      case 5: return ""+postiosoite    ;
      case 6: return ""+kotipuhelin    ;
      case 7: return ""+tyopuhelin     ;
      case 8: return ""+autopuhelin    ;
      case 9: return ""+liittymisvuosi ;
      case 10: return ""+jmaksu         ;
      case 11: return ""+maksu          ;
      case 12: return ""+lisatietoja    ;
      default:  return "Äääliö";
    }
  }

  /**
   * Asettaa k:n kentän arvoksi parametrina tuodun merkkijonon arvon
   * @param k kuinka monennen kentän arvo asetetaan
   * @param jono jonoa joka asetetaan kentän arvoksi
   * @return null jos asettaminen onnistuu, muuten vastaav virheilmoitus.
   */
  public String aseta(int k,String jono) {
    StringBuffer sb = new StringBuffer(jono);
    switch ( k ) {
      case 0:  tunnus_nro     = Mjonot.erota(sb,'§',tunnus_nro); return null;
      case 1:  nimi           = jono    ; return null;
      case 2:  hetu           = jono    ; return null;
      case 3:  katuosoite     = jono    ; return null;
      case 4:  postinumero    = jono    ; return null;
      case 5:  postiosoite    = jono    ; return null;
      case 6:  kotipuhelin    = jono    ; return null;
      case 7:  tyopuhelin     = jono    ; return null;
      case 8:  autopuhelin    = jono    ; return null;
      case 9:
        try {
          liittymisvuosi = Mjonot.erotaEx(sb,'§',liittymisvuosi);
        } catch (NumberFormatException ex) {
          return "Liittymisvuosi väärin " + ex.getMessage();
        }
        return null;
      case 10: jmaksu         = Mjonot.erota(sb,'§',jmaksu);         return null;
      case 11: maksu          = Mjonot.erota(sb,'§',maksu);          return null;
      case 12: lisatietoja    = Mjonot.erota(sb,'§',lisatietoja);    return null;
      default:  return "ÄÄliö";
    }
  }

  /**
   * Palauttaa k:tta jäsenen kenttää vastaavan kysymyksen
   * @param k kuinka monennen kentän kysymys palautetaan (0-alkuinen)
   * @return k:netta kenttää vastaava kysymys
   */
  public String getKysymys(int k) {
    switch ( k ) {
      case 0: return "Tunnus nro"     ;
      case 1: return "Jäsenen nimi"           ;
      case 2: return "hetu"           ;
      case 3: return "katuosoite"     ;
      case 4: return "postinumero"    ;
      case 5: return "postiosoite"    ;
      case 6: return "kotipuhelin"    ;
      case 7: return "tyopuhelin"     ;
      case 8: return "autopuhelin"   ;
      case 9: return "liittymisvuosi" ;
      case 10: return "jmaksu"         ;
      case 11: return "maksu"          ;
      case 12: return "lisatietoja"    ;
      default:  return "Äääliö";
    }
  }
  /**
   * Arvotaan satunnainen kokonaisluku välille [ala,yla]
   * @param ala arvonnan alaraja
   * @param yla arvonnan yläraja
   * @return satunnainen luku väliltä [ala,yla]
   */
  public static int rand(int ala, int yla) {
    double n = (yla-ala)*Math.random() + ala;
    return (int)Math.round(n);
  }

  /**
   * Apumetodi, jolla saadaan täytettyä testiarvot jäsenelle.
   * Henkilötunnus arvotaan, jotta kahdella jäsenellä ei olisi
   * samoja tietoja.
   */
  public void vastaa_aku_ankka() {
    String apuhetu = Mjonot.fmt(rand(1,31),2,'0') +
                     Mjonot.fmt(rand(1,12),2,'0') +
                     Mjonot.fmt(rand(1,99),2,'0') + "-" +
                     Mjonot.fmt(rand(1,1000),3,'0') +
                     ( (char)((int)'A'+rand(1,25)));

    nimi           = "Ankka Aku";
    hetu           = apuhetu;
    katuosoite     = "Ankkakuja 6";
    postinumero    = "12345";
    postiosoite    = "ANKKALINNA";
    kotipuhelin    = "12-1234";
    tyopuhelin     = "";
    autopuhelin    = "";
    liittymisvuosi = 1996;
    jmaksu         = 50.00;
    maksu          = 30.00;
    lisatietoja    = "Velkaa Roopelle";
  }

  /**
   * Tulostetaan henkilön tiedot
   * @param out tietovirta johon tulostetaan
   */
  public void tulosta(PrintStream out) {
    out.println(Mjonot.fmt(tunnus_nro,3,'0')+ "  " + nimi + "  " + hetu);
    out.println("  " + katuosoite + "  " +  postinumero + " " + postiosoite);
    out.println("  k: " + kotipuhelin +
                " t: " + tyopuhelin  +
                " a: " + autopuhelin);
    out.print("  Liittynyt " + liittymisvuosi + ".");
    out.println("  Jäsenmaksu " + Mjonot.fmt(jmaksu,4,2) + " mk." +
                "  Maksettu "   + Mjonot.fmt(maksu,4,2)  + " mk.");
    out.println("  " + lisatietoja);
  }

  /**
   * Tulostetaan henkilön tiedot
   * @param os tietovirta johon tulostetaan
   */
  public void tulosta(OutputStream os) {
    tulosta(new PrintStream(os));
  }

  /**
   * Antaa jäsenelle seuraavan rekisterinumeron.
   * @return jäsenen uusi tunnus_nro
   */
  public int  rekisteroi() {
    tunnus_nro = seuraava_nro;
    seuraava_nro++;
    return tunnus_nro;
  }

  public int getTunnus_nro() { return tunnus_nro; }

  /**
   * Muuttaa jäsenen tiedot |-erottetuksi merkkijonoksi
   * @return |-erotettu merkkijono
   */
  public String toString() {
    StringBuffer sb = new StringBuffer("");

    for (int k=0; k<getKenttia(); k++)
      sb.append(anna(k) + "|");
    return sb.toString();
  }

  /**
   * Otetaan jäsenen tiedot merkkijonosta joka on muotoa:<pre>
   * 1|Ankka Aku|130227-411J|Ankkakuja 6|12345|ANKKALINNA|12-1234|||1996|50.0|30.0|Velkaa Roopelle|
   * </pre>
   * @param rivi merkkijono josta tiedot otetaan.
   */
  public void parse(String rivi) {
    StringBuffer sb = new StringBuffer(rivi);
    for (int k = 0; k < getKenttia(); k++ )
      aseta(k,Mjonot.erota(sb,'|'));
    if ( tunnus_nro >= seuraava_nro ) seuraava_nro = tunnus_nro + 1;
  }

  /**
   * Testiohjelma jäsenelle.
   * @param args ei käytössä
   */
  public static void main(String args[]) {
    Jasen aku = new Jasen(), aku2 = new Jasen();
    aku.rekisteroi();
    aku2.rekisteroi();
    aku.tulosta(System.out);
    aku.vastaa_aku_ankka();
    aku.tulosta(System.out);

    aku2.vastaa_aku_ankka();
    aku2.tulosta(System.out);

    aku2.vastaa_aku_ankka();
    aku2.tulosta(System.out);

    System.out.println(aku2.toString());
  }

}