package javacodebook.core.writtennumber;

public class EnglishNumber implements WrittenNumber {
    
    int number;
    
    private static final String []EINER = {
        "zero", "one", "two", "three", "four", "five",
        "six", "seven", "eight", "nine", "ten", "eleven",
        "twelve", "thirteen", "fourteen", "fifteen",
        "sixteen", "seventeen", "eighteen", "nineteen"
    };
    
    private static final String []ZEHNER = {
        "","","twenty", "thirty", "fourty", "fivety",
        "sixty", "seventy", "eighty", "ninety"
    };
    
    public EnglishNumber(int number) {
        this.number = number;
    }
    
    public void setNumber(int number) {
        this.number = number;
    }
    
    public String toString() {
        if (number == 0)
            return "zero";
        else if (number == 1)
            return "one";
        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 < 20)
            buf.append(EINER[number]);
        else if (number%10 == 0){
            buf.append(ZEHNER[number/10]);
        } else {
            buf.append(ZEHNER[number/10]);
            buf.append(" ");
            buf.append(EINER[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(" hundred");
        } else {
            buf.append(EINER[number/100]);
            buf.append(" hundred ");
            less100(buf, number%100);
        }
    }
    
    private void lessMillion(StringBuffer buf, int number) {
        if (number < 1000) {
            less1000(buf, number);
        } else {
            less1000(buf, number/1000);
            buf.append(" thousand ");
            less1000(buf, number%1000);
        }
    }
}
