package kerho;
import java.io.*;
import fi.jyu.mit.ohj2.*;
/**
 * Kerhon jäsenen yksi kenttä
 *
 * Muutokset:  02.04.2003, kenttien indeksointi<br>
 *
 * @author Vesa Lappalainen
 * @version 1.0, 22.02.2003
 * @version 1.3, 02.04.2003
 */
public class Kentta {
  private String kysymys = "???";
  protected Tarkistaja tarkistaja = null;

  public Kentta(String kysymys)  { this.kysymys = kysymys; }
  public Kentta(String kysymys,Tarkistaja tarkistaja) {
    this.kysymys = kysymys;
    this.tarkistaja = tarkistaja;
  }

  public String toString() { return ""; }
  public String getAvain() { return toString().toUpperCase(); }
  public String getKysymys() { return kysymys; }
  public String aseta(String jono) { return null; }

  /**
   * Testiohjelma jäsenelle.
   * @param args ei käytössä
   */
  public static void main(String args[]) {
  }

}

class JonoKentta extends Kentta {
  String jono = "";

  public JonoKentta(String kysymys) { super(kysymys); }

  public JonoKentta(String kysymys,Tarkistaja tarkistaja) {
    super(kysymys,tarkistaja);
  }

  public String toString() { return jono; }

  public String aseta(String jono) {
    if ( tarkistaja == null ) {
      this.jono = jono; return null;
    }
    String virhe = tarkistaja.tarkista(jono);
    if ( virhe == null ) {
      this.jono = jono; return null;
    }
    return virhe;
  }

}

class HetuKentta extends JonoKentta {
  public HetuKentta(String kysymys) { super(kysymys); }

  public HetuKentta(String kysymys,Tarkistaja tarkistaja) {
    super(kysymys,tarkistaja);
  }
  public String getAvain() {
    StringBuffer sb = new StringBuffer(jono);
    char c = sb.charAt(4);
    sb.setCharAt(4,sb.charAt(0));
    sb.setCharAt(0,c);
    c = sb.charAt(5);
    sb.setCharAt(5,sb.charAt(1));
    sb.setCharAt(1,c);
    return sb.toString();  // pitäisi siirtää - jonon alkuun
                           // ja järkätä + < - < A
  }
}

class IntKentta extends Kentta {
  int arvo;
  public IntKentta(String kysymys) { super(kysymys); }

  public int getValue() { return arvo; }
  public void setValue(int value) { arvo = value; }

  public String toString() { return ""+arvo; }
  public String aseta(String jono) {
    StringBuffer sb = new StringBuffer(jono);
    try {
      this.arvo = Mjonot.erotaEx(sb,' ',0);
      return null;
    }
    catch (NumberFormatException ex) {
    return "Virhe: " + ex.getMessage(); }
  }
  public String getAvain() {
    return Mjonot.fmt(arvo,11,'0'); // Etumerkki...
  }
}

class DoubleKentta extends Kentta {
  double arvo;

  public DoubleKentta(String kysymys) { super(kysymys); }

  public double getValue() { return arvo; }
  public void setValue(int value) { arvo = value; }

  public String toString() { return ""+arvo; }
  public String aseta(String jono) {
    this.arvo = Mjonot.erotaDouble(jono,0.0);

//    StringBuffer s = new StringBuffer("1 3");
//    if ( s.equals("1 3") );

    return null;
  }
  public String getAvain() {
    return Mjonot.fmt(arvo,11,'0');
  }

}

class RahaKentta extends DoubleKentta {
  public RahaKentta(String kysymys) { super(kysymys); }
  public String toString() { return Mjonot.fmt(getValue(),4,2); }
}


interface Tarkistaja {
  public String tarkista(String jono);
}

class HetuTarkistus implements Tarkistaja {

  public String tarkista(String jono) {
    if ( jono == null || jono.length() < 1 ) return "Hetu liian lyhyt";
    if ( !Character.isDigit(jono.charAt(0)) ) return "Ei ala numerolla";
    return null;
  }

}