/*******************************************************************************
 * Copyright 2017 Bstek
 *
 * Licensed 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 com.bstek.ureport.definition.searchform;

import com.bstek.ureport.Utils;
import com.bstek.ureport.build.Dataset;
import com.bstek.ureport.exception.DatasetUndefinitionException;
import org.apache.commons.lang3.StringUtils;

import java.util.List;

/**
 * @author Jacky.gao
 * @since 2017年10月23日
 */
public class SelectInputComponent extends InputComponent {
    private boolean useDataset;
    private String dataset;
    private String labelField;
    private String valueField;
    private List<Option> options;

    @Override
    String inputHtml(RenderContext context) {
        String name = getBindParameter();
        Object pvalue = context.getParameter(name) == null ? "" : context.getParameter(name);
        StringBuilder sb = new StringBuilder();
        sb.append("<select style=\"padding:3px;height:28px\" id='").append(context.buildComponentId(this)).append("' name='").append(name).append("' class='form-control'>");
        if (useDataset && StringUtils.isNotBlank(dataset)) {
            Dataset ds = context.getDataset(dataset);
            if (ds == null) {
                throw new DatasetUndefinitionException(dataset);
            }
            for (Object obj : ds.getData()) {
                Object label = Utils.getProperty(obj, labelField);
                Object value = Utils.getProperty(obj, valueField);
                String selected = value.equals(pvalue) ? "selected" : "";
                sb.append("<option value='").append(value).append("' ").append(selected).append(">").append(label).append("</option>");
            }
            if (pvalue.equals("")) {
                sb.append("<option value='' selected></option>");
            }
        } else {
            for (Option option : options) {
                String value = option.getValue();
                String selected = value.equals(pvalue) ? "selected" : "";
                sb.append("<option value='").append(value).append("' ").append(selected).append(">").append(option.getLabel()).append("</option>");
            }
            if (pvalue.equals("")) {
                sb.append("<option value='' selected></option>");
            }
        }
        sb.append("</select>");
        return sb.toString();
    }

    @Override
    public String initJs(RenderContext context) {
        String name = getBindParameter();
        return "formElements.push(" +
                "function(){" +
                "if(''==='" + name + "'){" +
                "alert('列表框未绑定查询参数名，不能进行查询操作!');" +
                "throw '列表框未绑定查询参数名，不能进行查询操作!'" +
                "}" +
                "return {" +
                "\"" + name + "\":" +
                "$('#" + context.buildComponentId(this) + "').val()" +
                "}" +
                "}" +
                ");";
    }

    public boolean isUseDataset() {
        return useDataset;
    }

    public String getDataset() {
        return dataset;
    }

    public void setDataset(String dataset) {
        this.dataset = dataset;
    }

    public String getLabelField() {
        return labelField;
    }

    public void setLabelField(String labelField) {
        this.labelField = labelField;
    }

    public String getValueField() {
        return valueField;
    }

    public void setValueField(String valueField) {
        this.valueField = valueField;
    }

    public void setUseDataset(boolean useDataset) {
        this.useDataset = useDataset;
    }

    public void setOptions(List<Option> options) {
        this.options = options;
    }

    public List<Option> getOptions() {
        return options;
    }
}
