/*******************************************************************************
 * 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.model;

import java.util.Collection;

import org.ofbiz.widget.model.CommonWidgetModels.Link;
import org.ofbiz.widget.model.ModelFormField.AutoComplete;
import org.ofbiz.widget.model.ModelFormField.CheckField;
import org.ofbiz.widget.model.ModelFormField.ContainerField;
import org.ofbiz.widget.model.ModelFormField.DateFindField;
import org.ofbiz.widget.model.ModelFormField.DateTimeField;
import org.ofbiz.widget.model.ModelFormField.DisplayEntityField;
import org.ofbiz.widget.model.ModelFormField.DisplayField;
import org.ofbiz.widget.model.ModelFormField.DropDownField;
import org.ofbiz.widget.model.ModelFormField.FieldInfoWithOptions;
import org.ofbiz.widget.model.ModelFormField.FileField;
import org.ofbiz.widget.model.ModelFormField.HiddenField;
import org.ofbiz.widget.model.ModelFormField.HyperlinkField;
import org.ofbiz.widget.model.ModelFormField.IgnoredField;
import org.ofbiz.widget.model.ModelFormField.ImageField;
import org.ofbiz.widget.model.ModelFormField.InPlaceEditor;
import org.ofbiz.widget.model.ModelFormField.LookupField;
import org.ofbiz.widget.model.ModelFormField.PasswordField;
import org.ofbiz.widget.model.ModelFormField.RadioField;
import org.ofbiz.widget.model.ModelFormField.RangeFindField;
import org.ofbiz.widget.model.ModelFormField.ResetField;
import org.ofbiz.widget.model.ModelFormField.SubHyperlink;
import org.ofbiz.widget.model.ModelFormField.SubmitField;
import org.ofbiz.widget.model.ModelFormField.TextField;
import org.ofbiz.widget.model.ModelFormField.TextFindField;
import org.ofbiz.widget.model.ModelFormField.TextareaField;

/**
 * An object that generates XML from widget models.
 * The generated XML is unformatted - if you want to
 * "pretty print" the XML, then use a transformer.
 *
 */
public class XmlWidgetFieldVisitor extends XmlAbstractWidgetVisitor implements ModelFieldVisitor {

    public XmlWidgetFieldVisitor(Appendable writer) {
        super(writer);
    }

    @Override
    public void visit(CheckField checkField) throws Exception {
        visitModelField(checkField.getModelFormField());
        writer.append("<check");
        visitAttribute("all-checked", checkField.getAllChecked());
        visitFieldInfoWithOptions(checkField);
        writer.append("</check></field>");
    }

    @Override
    public void visit(ContainerField containerField) throws Exception {
        visitModelField(containerField.getModelFormField());
        writer.append("<container/></field>");
    }

    @Override
    public void visit(DateFindField dateTimeField) throws Exception {
        visitModelField(dateTimeField.getModelFormField());
        writer.append("<date-find");
        visitDateTimeFieldAttrs(dateTimeField);
        visitAttribute("default-option-from", dateTimeField.getDefaultOptionFrom());
        visitAttribute("default-option-thru", dateTimeField.getDefaultOptionThru());
        writer.append("/></field>");
    }

    @Override
    public void visit(DateTimeField dateTimeField) throws Exception {
        visitModelField(dateTimeField.getModelFormField());
        writer.append("<date-time");
        visitDateTimeFieldAttrs(dateTimeField);
        writer.append("/></field>");
    }

    @Override
    public void visit(DisplayEntityField displayField) throws Exception {
        visitModelField(displayField.getModelFormField());
        writer.append("<display-entity");
        visitDisplayFieldAttrs(displayField);
        visitAttribute("cache", displayField.getCache());
        visitAttribute("entity-name", displayField.getEntityName());
        visitAttribute("key-field-name", displayField.getKeyFieldName());
        writer.append(">");
        visitInPlaceEditor(displayField.getInPlaceEditor());
        visitSubHyperlink(displayField.getSubHyperlink());
        writer.append("</display-entity></field>");
    }

    @Override
    public void visit(DisplayField displayField) throws Exception {
        visitModelField(displayField.getModelFormField());
        writer.append("<display");
        visitDisplayFieldAttrs(displayField);
        writer.append(">");
        visitInPlaceEditor(displayField.getInPlaceEditor());
        writer.append("</display></field>");
    }

    @Override
    public void visit(DropDownField dropDownField) throws Exception {
        visitModelField(dropDownField.getModelFormField());
        writer.append("<drop-down");
        visitAttribute("allow-empty", dropDownField.getAllowEmpty());
        visitAttribute("allow-multiple", dropDownField.getAllowMultiple());
        visitAttribute("current", dropDownField.getCurrent());
        visitAttribute("current-description", dropDownField.getCurrentDescription());
        visitAttribute("other-field-size", dropDownField.getOtherFieldSize());
        visitAttribute("size", dropDownField.getSize());
        visitAttribute("text-size", dropDownField.getTextSize());
        visitFieldInfoWithOptions(dropDownField);
        visitAutoComplete(dropDownField.getAutoComplete());
        visitSubHyperlink(dropDownField.getSubHyperlink());
        writer.append("</drop-down></field>");
    }

    @Override
    public void visit(FileField textField) throws Exception {
        visitModelField(textField.getModelFormField());
        writer.append("<file");
        visitTextFieldAttrs(textField);
        writer.append(">");
        visitSubHyperlink(textField.getSubHyperlink());
        writer.append("</file></field>");
    }

    @Override
    public void visit(HiddenField hiddenField) throws Exception {
        visitModelField(hiddenField.getModelFormField());
        writer.append("<hidden");
        visitAttribute("value", hiddenField.getValue());
        writer.append("/></field>");
    }

    @Override
    public void visit(HyperlinkField hyperlinkField) throws Exception {
        visitModelField(hyperlinkField.getModelFormField());
        writer.append("<hyperlink");
        visitAttribute("also-hidden", hyperlinkField.getAlsoHidden());
        visitAttribute("confirmation-message", hyperlinkField.getConfirmationMsgExdr());
        visitAttribute("description", hyperlinkField.getDescription());
        visitAttribute("request-confirmation", hyperlinkField.getRequestConfirmation());
        Link link = hyperlinkField.getLink();
        visitLinkAttributes(link);
        if (link.getImage() != null || link.getAutoEntityParameters() != null || link.getAutoServiceParameters() != null) {
            writer.append(">");
            visitImage(link.getImage());
            visitAutoEntityParameters(link.getAutoEntityParameters());
            visitAutoServiceParameters(link.getAutoServiceParameters());
            writer.append("</hyperlink>");
        } else {
            writer.append("/>");
        }
        writer.append("</field>");
    }

    @Override
    public void visit(IgnoredField ignoredField) throws Exception {
        visitModelField(ignoredField.getModelFormField());
        writer.append("<ignored/></field>");
    }

    @Override
    public void visit(ImageField imageField) throws Exception {
        visitModelField(imageField.getModelFormField());
        writer.append("<image");
        visitAttribute("alternate", imageField.getAlternate());
        visitAttribute("default-value", imageField.getDefaultValue());
        visitAttribute("description", imageField.getDescription());
        visitAttribute("style", imageField.getStyle());
        visitAttribute("value", imageField.getValue());
        writer.append(">");
        visitSubHyperlink(imageField.getSubHyperlink());
        writer.append("</image></field>");
    }

    @Override
    public void visit(LookupField textField) throws Exception {
        visitModelField(textField.getModelFormField());
        writer.append("<lookup");
        visitTextFieldAttrs(textField);
        visitAttribute("description-field-name", textField.getDescriptionFieldName());
        visitAttribute("fade-background", textField.getFadeBackground());
        visitAttribute("target-form-name", textField.getFormName());
        visitAttribute("initially-collapsed", textField.getInitiallyCollapsed());
        visitAttribute("height", textField.getLookupHeight());
        visitAttribute("position", textField.getLookupPosition());
        visitAttribute("presentation", textField.getLookupPresentation());
        visitAttribute("width", textField.getLookupWidth());
        visitAttribute("show-description", textField.getShowDescription());
        visitAttribute("target-parameter", textField.getTargetParameter());
        writer.append(">");
        visitSubHyperlink(textField.getSubHyperlink());
        writer.append("</lookup></field>");
    }

    @Override
    public void visit(PasswordField textField) throws Exception {
        visitModelField(textField.getModelFormField());
        writer.append("<password");
        visitTextFieldAttrs(textField);
        writer.append(">");
        visitSubHyperlink(textField.getSubHyperlink());
        writer.append("</password></field>");
    }

    @Override
    public void visit(RadioField radioField) throws Exception {
        visitModelField(radioField.getModelFormField());
        writer.append("<radio");
        visitFieldInfoWithOptions(radioField);
        writer.append("</radio></field>");
    }

    @Override
    public void visit(RangeFindField textField) throws Exception {
        visitModelField(textField.getModelFormField());
        writer.append("<range-find");
        visitTextFieldAttrs(textField);
        visitAttribute("default-option-from", textField.getDefaultOptionFrom());
        visitAttribute("default-option-thru", textField.getDefaultOptionThru());
        writer.append(">");
        visitSubHyperlink(textField.getSubHyperlink());
        writer.append("</range-find></field>");
    }

    @Override
    public void visit(ResetField resetField) throws Exception {
        visitModelField(resetField.getModelFormField());
        writer.append("<reset/></field>");
    }

    @Override
    public void visit(SubmitField submitField) throws Exception {
        visitModelField(submitField.getModelFormField());
        writer.append("<submit");
        visitAttribute("background-submit-refresh-target", submitField.getBackgroundSubmitRefreshTargetExdr());
        visitAttribute("button-type", submitField.getButtonType());
        visitAttribute("confirmation-message", submitField.getConfirmationMsgExdr());
        visitAttribute("image-location", submitField.getImageLocation());
        visitAttribute("request-confirmation", submitField.getRequestConfirmation());
        writer.append("/></field>");
    }

    @Override
    public void visit(TextareaField textareaField) throws Exception {
        visitModelField(textareaField.getModelFormField());
        writer.append("<textarea");
        visitAttribute("cols", textareaField.getCols());
        visitAttribute("default-value", textareaField.getDefaultValue());
        visitAttribute("read-only", textareaField.isReadOnly());
        visitAttribute("rows", textareaField.getRows());
        visitAttribute("visual-editor-buttons", textareaField.getVisualEditorButtons());
        visitAttribute("visual-editor-enable", textareaField.getVisualEditorEnable());
        writer.append("/></field>");
    }

    @Override
    public void visit(TextField textField) throws Exception {
        visitModelField(textField.getModelFormField());
        writer.append("<text");
        visitTextFieldAttrs(textField);
        writer.append(">");
        visitSubHyperlink(textField.getSubHyperlink());
        writer.append("</text></field>");
    }

    @Override
    public void visit(TextFindField textField) throws Exception {
        visitModelField(textField.getModelFormField());
        writer.append("<text-find");
        visitTextFieldAttrs(textField);
        visitAttribute("default-option", textField.getDefaultOption());
        visitAttribute("hide-options", textField.getHideOptions());
        visitAttribute("ignore-case", textField.getIgnoreCase());
        writer.append(">");
        visitSubHyperlink(textField.getSubHyperlink());
        writer.append("</text-find></field>");
    }

    private void visitTextFieldAttrs(TextField field) throws Exception {
        visitAttribute("client-autocomplete-field", field.getClientAutocompleteField());
        visitAttribute("default-value", field.getDefaultValue());
        visitAttribute("disabled", field.getDisabled());
        visitAttribute("mask", field.getMask());
        visitAttribute("maxlength", field.getMaxlength());
        visitAttribute("placeholder", field.getPlaceholder());
        visitAttribute("read-only", field.getReadonly());
        visitAttribute("size", field.getSize());
    }

    private void visitDisplayFieldAttrs(DisplayField field) throws Exception {
        visitAttribute("also-hidden", field.getAlsoHidden());
        visitAttribute("currency", field.getCurrency());
        visitAttribute("date", field.getDate());
        visitAttribute("default-value", field.getDefaultValue());
        visitAttribute("description", field.getDescription());
        visitAttribute("image-location", field.getImageLocation());
        visitAttribute("size", field.getSize());
        visitAttribute("type", field.getType());
    }

    private void visitDateTimeFieldAttrs(DateTimeField field) throws Exception {
        visitAttribute("default-value", field.getDefaultValue());
        visitAttribute("type", field.getType());
        visitAttribute("input-method", field.getInputMethod());
        visitAttribute("clock", field.getClock());
        visitAttribute("mask", field.getMask());
        visitAttribute("step", field.getStep());
    }

    private void visitFieldInfoWithOptions(FieldInfoWithOptions fieldInfo) throws Exception {
        visitAttribute("no-current-selected-key", fieldInfo.getNoCurrentSelectedKey());
        writer.append(">");
        // TODO: Options
    }

    private void visitModelField(ModelFormField modelField) throws Exception {
        writer.append("<field");
        visitAttribute("name", modelField.getName());
        visitAttribute("action", modelField.getAction());
        visitAttribute("attribute-name", modelField.getAttributeName());
        visitAttribute("encode-output", modelField.getEncodeOutput());
        visitAttribute("entity-name", modelField.getEntityName());
        visitAttribute("entry-name", modelField.getEntryName());
        visitAttribute("event", modelField.getEvent());
        visitAttribute("field-name", modelField.getFieldName());
        visitAttribute("header-link", modelField.getHeaderLink());
        visitAttribute("header-link-style", modelField.getHeaderLinkStyle());
        visitAttribute("id-name", modelField.getIdName());
        visitAttribute("map-name", modelField.getMapName());
        visitAttribute("parameter-name", modelField.getParameterName());
        visitAttribute("position", modelField.getPosition());
        visitAttribute("red-when", modelField.getRedWhen());
        visitAttribute("required-field", modelField.getRequiredField());
        visitAttribute("required-field-style", modelField.getRequiredFieldStyle());
        visitAttribute("separate-column", modelField.getSeparateColumn());
        visitAttribute("service-name", modelField.getServiceName());
        visitAttribute("sort-field", modelField.getSortField());
        visitAttribute("sort-field-asc-style", modelField.getSortFieldAscStyle());
        visitAttribute("sort-field-desc-style", modelField.getSortFieldDescStyle());
        visitAttribute("sort-field-help-text", modelField.getSortFieldHelpText());
        visitAttribute("sort-field-style", modelField.getSortFieldStyle());
        visitAttribute("title", modelField.getTitle());
        visitAttribute("title-area-style", modelField.getTitleAreaStyle());
        visitAttribute("title-style", modelField.getTitleStyle());
        visitAttribute("tooltip", modelField.getTooltip());
        visitAttribute("tooltip-style", modelField.getTooltipStyle());
        visitAttribute("use-when", modelField.getUseWhen());
        visitAttribute("widget-area-style", modelField.getWidgetAreaStyle());
        visitAttribute("widget-style", modelField.getWidgetStyle());
        writer.append(">");
        visitUpdateAreas(modelField.getOnChangeUpdateAreas());
        visitUpdateAreas(modelField.getOnClickUpdateAreas());
    }

    private void visitSubHyperlink(SubHyperlink hyperlink) throws Exception {
        if (hyperlink != null) {
            writer.append("<sub-hyperlink");
            Link link = hyperlink.getLink();
            visitLinkAttributes(link);
            visitAttribute("description", hyperlink.getDescription());
            visitAttribute("use-when", hyperlink.getUseWhen());
            if (link.getImage() != null || link.getAutoEntityParameters() != null || link.getAutoServiceParameters() != null) {
                writer.append(">");
                visitImage(link.getImage());
                visitAutoEntityParameters(link.getAutoEntityParameters());
                visitAutoServiceParameters(link.getAutoServiceParameters());
                writer.append("</sub-hyperlink>");
            } else {
                writer.append("/>");
            }
        }
    }

    private void visitAutoComplete(AutoComplete autoComplete) throws Exception {
        if (autoComplete != null) {
            writer.append("<auto-complete");
            visitAttribute("auto-select", autoComplete.getAutoSelect());
            visitAttribute("frequency", autoComplete.getFrequency());
            visitAttribute("min-chars", autoComplete.getMinChars());
            visitAttribute("choices", autoComplete.getChoices());
            visitAttribute("partial-search", autoComplete.getPartialSearch());
            visitAttribute("partial-chars", autoComplete.getPartialChars());
            visitAttribute("ignore-case", autoComplete.getIgnoreCase());
            visitAttribute("full-search", autoComplete.getFullSearch());
            writer.append("/>");
        }
    }

    private void visitInPlaceEditor(InPlaceEditor editor) throws Exception {
        if (editor != null) {
            writer.append("<in-place-editor");
            visitAttribute("cancel-control", editor.getCancelControl());
            visitAttribute("cancel-text", editor.getCancelText());
            visitAttribute("click-to-edit-text", editor.getClickToEditText());
            visitAttribute("field-post-creation", editor.getFieldPostCreation());
            visitAttribute("form-class-name", editor.getFormClassName());
            visitAttribute("highlight-color", editor.getHighlightColor());
            visitAttribute("highlight-end-color", editor.getHighlightEndColor());
            visitAttribute("hover-class-name", editor.getHoverClassName());
            visitAttribute("html-response", editor.getHtmlResponse());
            visitAttribute("loading-class-name", editor.getLoadingClassName());
            visitAttribute("loading-text", editor.getLoadingText());
            visitAttribute("ok-control", editor.getOkControl());
            visitAttribute("ok-text", editor.getOkText());
            visitAttribute("param-name", editor.getParamName());
            visitAttribute("saving-class-name", editor.getSavingClassName());
            visitAttribute("saving-text", editor.getSavingText());
            visitAttribute("submit-on-blur", editor.getSubmitOnBlur());
            visitAttribute("text-before-controls", editor.getTextBeforeControls());
            visitAttribute("text-after-controls", editor.getTextAfterControls());
            visitAttribute("text-between-controls", editor.getTextBetweenControls());
            visitAttribute("update-after-request-call", editor.getUpdateAfterRequestCall());
            visitAttribute("url", editor.getUrl());
            if (!editor.getCols().isEmpty() || !editor.getRows().isEmpty()) {
                writer.append(">");
                writer.append("<simple-editor");
                visitAttribute("cols", editor.getCols());
                visitAttribute("rows", editor.getRows());
                writer.append("/></in-place-editor>");
            } else {
                writer.append("/>");
            }
        }
    }

    private void visitUpdateAreas(Collection<ModelForm.UpdateArea> updateAreas) throws Exception {
        for (ModelForm.UpdateArea updateArea : updateAreas) {
            writer.append("<on-field-event-update-area");
            visitAttribute("event-type", updateArea.getEventType());
            visitAttribute("area-id", updateArea.getAreaId());
            visitAttribute("area-target", updateArea.getAreaTarget());
            writer.append(">");
            visitAutoEntityParameters(updateArea.getAutoEntityParameters());
            visitAutoServiceParameters(updateArea.getAutoServiceParameters());
            visitParameters(updateArea.getParameterList());
            writer.append("</on-field-event-update-area>");
        }
    }
}
