/*******************************************************************************
 * Licensed to the Apache Software Foundation (ASF) under one
 * or more contributor license agreements.  See the NOTICE file
 * distributed with this work for additional information
 * regarding copyright ownership.  The ASF licenses this file
 * to you under the Apache License, Version 2.0 (the
 * "License"); you may not use this file except in compliance
 * with the License.  You may obtain a copy of the License at
 *
 * http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing,
 * software distributed under the License is distributed on an
 * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
 * KIND, either express or implied.  See the License for the
 * specific language governing permissions and limitations
 * under the License.
 *******************************************************************************/
package org.ofbiz.widget.form;

import java.io.IOException;
import java.util.Collections;
import java.util.HashMap;
import java.util.Map;

import org.ofbiz.widget.ModelFieldVisitor;
import org.w3c.dom.Element;

/**
 * Form field abstract class.
 */
public abstract class FieldInfo {

    public static final int DISPLAY = 1;
    public static final int HYPERLINK = 2;
    public static final int TEXT = 3;
    public static final int TEXTAREA = 4;
    public static final int DATE_TIME = 5;
    public static final int DROP_DOWN = 6;
    public static final int CHECK = 7;
    public static final int RADIO = 8;
    public static final int SUBMIT = 9;
    public static final int RESET = 10;
    public static final int HIDDEN = 11;
    public static final int IGNORED = 12;
    public static final int TEXTQBE = 13;
    public static final int DATEQBE = 14;
    public static final int RANGEQBE = 15;
    public static final int LOOKUP = 16;
    public static final int FILE = 17;
    public static final int PASSWORD = 18;
    public static final int IMAGE = 19;
    public static final int DISPLAY_ENTITY = 20;
    // the numbering here represents the priority of the source;
    //when setting a new fieldInfo on a modelFormField it will only set
    //the new one if the fieldSource is less than or equal to the existing
    //fieldSource, which should always be passed as one of the following...
    public static final int SOURCE_EXPLICIT = 1;
    public static final int SOURCE_AUTO_ENTITY = 2;
    public static final int SOURCE_AUTO_SERVICE = 3;
    private static Map<String, Integer> fieldTypeByName = createFieldTypeMap();

    private static Map<String, Integer> createFieldTypeMap() {
        Map<String, Integer> fieldTypeByName = new HashMap<String, Integer>();
        fieldTypeByName.put("display", Integer.valueOf(1));
        fieldTypeByName.put("hyperlink", Integer.valueOf(2));
        fieldTypeByName.put("text", Integer.valueOf(3));
        fieldTypeByName.put("textarea", Integer.valueOf(4));
        fieldTypeByName.put("date-time", Integer.valueOf(5));
        fieldTypeByName.put("drop-down", Integer.valueOf(6));
        fieldTypeByName.put("check", Integer.valueOf(7));
        fieldTypeByName.put("radio", Integer.valueOf(8));
        fieldTypeByName.put("submit", Integer.valueOf(9));
        fieldTypeByName.put("reset", Integer.valueOf(10));
        fieldTypeByName.put("hidden", Integer.valueOf(11));
        fieldTypeByName.put("ignored", Integer.valueOf(12));
        fieldTypeByName.put("text-find", Integer.valueOf(13));
        fieldTypeByName.put("date-find", Integer.valueOf(14));
        fieldTypeByName.put("range-find", Integer.valueOf(15));
        fieldTypeByName.put("lookup", Integer.valueOf(16));
        fieldTypeByName.put("file", Integer.valueOf(17));
        fieldTypeByName.put("password", Integer.valueOf(18));
        fieldTypeByName.put("image", Integer.valueOf(19));
        fieldTypeByName.put("display-entity", Integer.valueOf(20));
        fieldTypeByName.put("container", Integer.valueOf(21));
        return Collections.unmodifiableMap(fieldTypeByName);
    }

    public static int findFieldTypeFromName(String name) {
        Integer fieldTypeInt = FieldInfo.fieldTypeByName.get(name);
        if (fieldTypeInt != null) {
            return fieldTypeInt;
        } else {
            throw new IllegalArgumentException("Could not get fieldType for field type name " + name);
        }
    }

    private final int fieldType;
    private final int fieldSource;
    private final ModelFormField modelFormField;

    /** XML Constructor */
    protected FieldInfo(Element element, ModelFormField modelFormField) {
        this.fieldSource = FieldInfo.SOURCE_EXPLICIT;
        this.fieldType = findFieldTypeFromName(element.getTagName());
        this.modelFormField = modelFormField;
    }

    /** Value Constructor */
    protected FieldInfo(int fieldSource, int fieldType, ModelFormField modelFormField) {
        this.fieldType = fieldType;
        this.fieldSource = fieldSource;
        this.modelFormField = modelFormField;
    }

    public abstract void accept(ModelFieldVisitor visitor);

    /**
     * Returns a new instance of this object.
     * 
     * @param modelFormField
     */
    public abstract FieldInfo copy(ModelFormField modelFormField);

    public int getFieldSource() {
        return fieldSource;
    }

    public int getFieldType() {
        return fieldType;
    }

    public ModelFormField getModelFormField() {
        return modelFormField;
    }

    public abstract void renderFieldString(Appendable writer, Map<String, Object> context, FormStringRenderer formStringRenderer)
            throws IOException;
}
