package cnp.ew.properties;

import java.util.*;
import java.awt.*;

import cnp.ew.displayer.*;
import cnp.ew.converter.*;
import cnp.ew.spin.*;
import cnp.ew.button.*;
import cnp.ew.text.*;

public class CpBasicType implements CpType
{
    public static final int STRING_ID = 0;
    public static final int NUMBER_ID = 1;
    public static final int BOOLEAN_ID = 2;
    public static final int TIME_ID = 3;
    public static final int DATE_ID = 4;
    public static final int PERCENTAGE_ID = 5;
    public static final int CURRENCY_ID = 6;
    public static final int IMAGE_ID = 7;
    public static final int COLOR_ID = 8;
    public static final int SOCIAL_SECURITY_NUMBER_ID = 9;
    public static final int PHONE_NUMBER_ID = 10;
    public static final int OBJECT_ID = 11;

    public static final CpBasicType STRING = new CpBasicType(STRING_ID);
    public static final CpBasicType NUMBER = new CpBasicType(NUMBER_ID);
    public static final CpBasicType BOOLEAN = new CpBasicType(BOOLEAN_ID);
    public static final CpBasicType TIME = new CpBasicType(TIME_ID);
    public static final CpBasicType DATE = new CpBasicType(DATE_ID);
    public static final CpBasicType PERCENTAGE = new CpBasicType(PERCENTAGE_ID);
    public static final CpBasicType CURRENCY = new CpBasicType(CURRENCY_ID);
    public static final CpBasicType IMAGE = new CpBasicType(IMAGE_ID);
    public static final CpBasicType COLOR = new CpBasicType(COLOR_ID);
    public static final CpBasicType SOCIAL_SECURITY_NUMBER = new CpBasicType(SOCIAL_SECURITY_NUMBER_ID);
    public static final CpBasicType PHONE_NUMBER = new CpBasicType(PHONE_NUMBER_ID);
    public static final CpBasicType OBJECT = new CpBasicType(OBJECT_ID);

    public static CpGeneralStringDisplayer stringDisplayer;
    public static CpGeneralStringDisplayer rightDisplayer;
    public static CpStringToStringConverter stringConverter;
    public static CpColorDisplayer colorDisplayer;
    public static CpNumberToStringConverter numberConverter;
    public static CpBooleanToStringConverter booleanConverter;
    public static CpDateToStringConverter timeConverter;
    public static CpDateToStringConverter dateConverter;
    public static CpBoxedValueDisplayer barDisplayer;
    public static CpNumberToStringConverter currencyConverter;
    public static CpImageDisplayer imageDisplayer;

    static {
        stringDisplayer = new CpGeneralStringDisplayer();
        rightDisplayer = new CpGeneralStringDisplayer();
        rightDisplayer.setHorizontalAlignment(CpAlignable.ALIGN_RIGHT);
        stringConverter = new CpStringToStringConverter();
        colorDisplayer = new CpColorDisplayer();
        numberConverter = new CpNumberToStringConverter();
        numberConverter.setFormatString("General");
        booleanConverter = new CpBooleanToStringConverter();
        timeConverter = new CpDateToStringConverter();
        timeConverter.setFormatString("hh:mm AM/PM");
        dateConverter = new CpDateToStringConverter();
        dateConverter.setFormatString("mm/dd/yy");
        barDisplayer = new CpBoxedValueDisplayer();
        currencyConverter = new CpNumberToStringConverter();
        currencyConverter.setFormatString("$#,###");
        imageDisplayer = new CpImageDisplayer();
    }

    int type;

    public CpBasicType(int newType)
    {
        type = newType;
    }

    public CpModelSelectableDisplayable getDefaultDisplayer()
    {
        switch (type) {
           // case PERCENTAGE_ID : return barDisplayer;  ARG!!! THIS IS NOT MODELSELETABLE
           // case IMAGE_ID : return imageDisplayer;   ARG!!! THIS IS NOT MODELSELETABLE
            case COLOR_ID : return colorDisplayer;
            case CURRENCY_ID : return rightDisplayer;
            case NUMBER_ID : return rightDisplayer;
            default: return stringDisplayer;
        }
    }

    public CpToStringConverter getDefaultConverter()
    {
        switch (type) {
            case NUMBER_ID : return numberConverter;
            case BOOLEAN_ID: return booleanConverter;
            case TIME_ID: return timeConverter;
            case DATE_ID: return dateConverter;
            case CURRENCY_ID: return currencyConverter;
            case STRING_ID: return stringConverter;
            default : return null;
        }
    }

    public CpEditor getDefaultEditor()
    {
        switch (type) {
        case STRING_ID :
            CpEntryFieldLc lc = new CpEntryFieldLc();
            lc.setSelectAllOnGettingFocus(true);
            return lc;
//            case PERCENTAGE : return new CpSlider();
//            case IMAGE : return ???;
        case NUMBER_ID :
            return new CpIntegerSpinEditorLc();
        case BOOLEAN_ID:
            return new CpCheckboxLc();
        case TIME_ID:
            return new CpTimeSpinEditorLc();
        case DATE_ID:
            return new CpDateSpinEditorLc();
        case CURRENCY_ID:
            return new CpIntegerSpinEditorLc();
        case COLOR_ID:
            return new CpColorEditorLc();
        case SOCIAL_SECURITY_NUMBER_ID:
            return new CpFormattedStringSpinEditorLc("###-##-####");
        case PHONE_NUMBER_ID:
            return new CpFormattedStringSpinEditorLc("(###) ###-####");
        default :
            return null;
        }
    }

    public Object parseString(String s)
    {
        if (type == NUMBER_ID) {
            // Uh, oh.  Better think about this. Double?  Integer?
            Double num = null;
            try {
                num = new Double((String)s);
            } catch (Exception e) {
            }
            return num;
        }
        if (type == DATE_ID) {
            int day, month, year;
            StringTokenizer st = new StringTokenizer(s, "/-", true);
            String t;
            try { month = (new Integer(st.nextToken().trim())).intValue(); } catch (Exception e) { return null; }
            try { t = st.nextToken().trim(); } catch (Exception e) {return null; }
            if (!t.equals("/") && !t.equals("-")) {
                return null;
            }
            try { day = (new Integer(st.nextToken().trim())).intValue(); } catch (Exception e) { return null; }
            try { t = st.nextToken().trim(); } catch (Exception e) {return null; }
            if (!t.equals("/") && !t.equals("-")) {
                return null;
            }
            try { year = (new Integer(st.nextToken().trim())).intValue(); } catch (Exception e) { return null; }
            return new Date(year, month - 1, day);
        }
        return null;
    }

    public Vector getFormats()
    {
        Vector v = new Vector();
        switch (type) {
            case NUMBER_ID : {
                v.addElement("$#,###.00;($#,###.00)");
                v.addElement("#,###.00;-#,###.00");
                v.addElement("###.##");
                v.addElement("#.####");
                v.addElement("#.00");
                v.addElement("#.##e+00");
                v.addElement("#/#");
                v.addElement("#/2");
                v.addElement("#/4");
                v.addElement("#/8");
                v.addElement("#/10");
                break;
            }
            case DATE_ID : {
                v.addElement("m/d");
                v.addElement("m/d/y");
                v.addElement("mm/dd/y");
                v.addElement("d-mmm");
                v.addElement("d-mmm-y");
                v.addElement("dd-mmm-y");
                v.addElement("mmmm-y");
                v.addElement("mmmm d, yyyy");
                v.addElement("m/d/y h:nn AM/PM");
                v.addElement("m/d/y h:nn");
                v.addElement("hh:nn");
                v.addElement("hh:nn AM/PM");
                v.addElement("hh:nn:ss AM/PM");
                v.addElement("nn:ss");
                break;
            }
        }
        return v;
    }


    public String toString()
    {
        switch (type) {
            case STRING_ID : return "String";
            case PERCENTAGE_ID : return "Percentage";
            case IMAGE_ID : return "Image";
            case NUMBER_ID : return "Number";
            case BOOLEAN_ID: return "Boolean";
            case TIME_ID: return "Time";
            case DATE_ID: return "Date";
            case CURRENCY_ID: return "Currency";
            case COLOR_ID: return "Color";
            default : return null;
        }
    }
}