package javacodebook.core.writtennumber;

public class GermanNumber implements WrittenNumber {
    
    int number;
    
    private static final String []EINER = {
        "null", "ein", "zwei", "drei", "vier", "fünf",
        "sechs", "sieben", "acht", "neun", "zehn", "elf",
        "zwölf", "dreizehn", "vierzehn", "fünfzehn",
        "sechszehn", "siebzehn", "achtzehn", "neunzehn"
    };
    
    private static final String []ZEHNER = {
        "","","zwanzig", "dreissig", "vierzig", "fünfzig",
        "sechzig", "siebzig", "achtzig", "neunzig"
    };
    
    public GermanNumber(int number) {
        this.number = number;
    }
    
    public void setNumber(int number) {
        this.number = number;
    }
    
    public String toString() {
        if (number == 0)
            return "null";
        else if (number == 1)
            return "eins";
        else {
            StringBuffer buf = new StringBuffer();
            lessMillion(buf, number);
            return buf.toString();
        }
    }
    
    private void less100(StringBuffer buf, int number) {
        if (number == 0)
            return;
        else if (number == 1)
            buf.append("eins");
        else if (number < 20)
            buf.append(EINER[number]);
        else if (number%10 == 0){
            buf.append(ZEHNER[number/10]);
        } else {
            buf.append(EINER[number%10]);
            buf.append("und");
            buf.append(ZEHNER[number/10]);
        }
    }
    
    private void less1000(StringBuffer buf, int number) {
        if (number < 100) {
            less100(buf, number);
        } else if (number%100 == 0) {
            buf.append(EINER[number/100]);
            buf.append("hundert");
        } else {
            buf.append(EINER[number/100]);
            buf.append("hundert ");
            less100(buf, number%100);
        }
    }
    
    private void lessMillion(StringBuffer buf, int number) {
        if (number < 1000) {
            less1000(buf, number);
        } else if (number < 2000) {
            buf.append("ein tausend ");
            less1000(buf, number%1000);
        } else {
            less1000(buf, number/1000);
            buf.append(" tausend ");
            less1000(buf, number%1000);
        }
    }
}
