package org.jeecg.module.custom.ocr.utils.requestFormat;

import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import org.apache.commons.lang3.StringUtils;
import org.apache.commons.lang3.Validate;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import javax.servlet.ServletRequest;
import java.util.*;

/**
 * Created by zhangyong on 2018/2/9.
 */

public class SearchQueryUtil {

    private Logger log = LoggerFactory.getLogger(SearchQueryUtil.class);
    /**
     * 目前使用的是 "equal": "相等", "notequal": "不相等", "like": "相似", "greater": "大于",
     * "greaterorequal": "大于或等于", "less": "小于", "lessorequal": "小于或等于" "in" : 包含
     */
    public final static Map<String, String> filterMap = new HashMap<String, String>() {
        private static final long serialVersionUID = 1L;
        {

            put("equal", "=");// 相等
            put("notequal", "<>");// 不相等
            put("like", "like");// 相似
            put("greater", ">");// 大于
            put("greaterorequal", ">=");// 大于或等于
            put("less", "<");// 小于
            put("lessorequal", "<=");// 小于或等于
            put("in", "in");// 包含
            put("notin", "not in");// 不包含
        }
    };

    /**
     * 该方法针对mybatis使用把json串转换为map对象
     *
     * @param jsonObject 搜索条件的json串
     * @param query 搜索对象
     * @return 返回搜索条件对象
     */
    public static Map<String, Object> queryStringFormat(JSONObject jsonObject, Map<String, Object> query) {

        // 格式化json查询信息
        SearchQueryForm searchQueryForm = formatSearchQueryForm(jsonObject);

        if (null != searchQueryForm) {

            query.put(searchQueryForm.getField(), searchQueryForm);
        }

        return query;
    }
    /**
     * 该方法针对mybatis使用把json串转换为map对象
     *
     * @param fvalue 搜索条件的json串
     * @param query 搜索对象
     * @return 返回搜索条件对象
     */
    public static Map<String, Object> queryStringFormat(String fvalue,Map<String, Object> query) {

        // 格式化json查询信息
        List<SearchQueryForm> lflist = SearchQueryUtil.formatFilterValue(fvalue);

        if (null != lflist && lflist.size() > 0) {

            int lfs = lflist.size();

            for (int i = 0; i < lfs; i++) {
                SearchQueryForm lf = lflist.get(i);
                // 存放搜索字段对应的搜索内容
                query.put(lf.getField(), lf);
            }
        }

        return query;
    }
    /**
     * 格式化页面json数据
     *
     * @param fvalue 该数据为json数据
     * @return 返回json数据对象SearchQueryForm
     */
    private static List<SearchQueryForm> formatFilterValue(String fvalue) {
        // 初始化json对象集合
        List<SearchQueryForm> list = new ArrayList(1);

        if(StringUtils.isNotBlank(fvalue)){
            // 格式化json数据
                JSONArray array = JSONArray.parseArray(fvalue);
                if (null != array && array.size() > 0) {
                    int as = array.size();
                    for (int i = 0; i < as; i++) {
                        JSONObject object = array.getJSONObject(i);
                        SearchQueryForm lf = formatSearchQueryForm(object);

                        list.add(lf);
                    }
                }

        }

        return list;
    }

    /**
     * 搜索json对象转换为搜索对象
     * @param object 搜索json
     * @return 返回搜索对象
     */
    private static SearchQueryForm formatSearchQueryForm(JSONObject object){
        SearchQueryForm lf = new SearchQueryForm();
        lf.setField(object.getString("field"));
        lf.setOp(object.getString("op"));
        lf.setType(object.getString("type"));
        lf.setDataOp(SearchQueryUtil.filterMap.get(lf.getOp()));

        if("number".equals(lf.getType())){
            lf.setValue(object.getInteger("value"));
        }else{
            lf.setValue(object.getString("value"));
        }
        return lf;
    }

    /**
     * 取得带相同前缀的Request Parameters, copy from spring WebUtils.
     *
     * 返回的结果的Parameter名已去除前缀.
     * 并且拼装成ligerui形式使用的搜索条件
     */
    public static String getParametersStartingWithToJson(ServletRequest request, String prefix) {
        Validate.notNull(request, "Request must not be null");
        Enumeration<?> paramNames = request.getParameterNames();
        Map<String, Object> params = new TreeMap<String, Object>();
        if (prefix == null) {
            prefix = "";
        }
        while ((paramNames != null) && paramNames.hasMoreElements()) {
            String paramName = (String) paramNames.nextElement();
            if ("".equals(prefix) || paramName.startsWith(prefix)) {
                String unprefixed = paramName.substring(prefix.length());
                String[] values = request.getParameterValues(paramName);
                if ((values == null) || (values.length == 0)) {
                    // 这里不做任何处理
                } else if (values.length > 1) {
                    params.put(unprefixed, values);
                } else {
                    if(null == values[0] || values[0].length() == 0){
                        // 这里不做任何处理
                    }else{
                        params.put(unprefixed, values[0]);
                    }
                }
            }
        }
        JSONArray jsonArray = new JSONArray();
        if(null != params && params.size() > 0){

            for (Map.Entry<String, Object> entry : params.entrySet()) {

                JSONObject obj = JSON.parseObject(entry.getValue().toString());
                if(StringUtils.isNotBlank(obj.getString("value"))){

                    obj.put("field",entry.getKey());
                    jsonArray.add(obj);
                }
            }
        }

        return jsonArray.toString();
    }
    /**
     * 取得带相同前缀的Request Parameters, copy from spring WebUtils.
     *
     * 返回的结果的Parameter名已去除前缀.
     */
    public static Map<String, Object> getParametersStartingWith(ServletRequest request, String prefix) {
        Validate.notNull(request, "Request must not be null");
        Enumeration<?> paramNames = request.getParameterNames();
        Map<String, Object> params = new TreeMap<String, Object>();
        if (prefix == null) {
            prefix = "";
        }
        while ((paramNames != null) && paramNames.hasMoreElements()) {
            String paramName = (String) paramNames.nextElement();
            if ("".equals(prefix) || paramName.startsWith(prefix)) {
                String unprefixed = paramName.substring(prefix.length());
                String[] values = request.getParameterValues(paramName);
                if ((values == null) || (values.length == 0)) {
                    // 这里不做任何处理
                } else if (values.length > 1) {
                    params.put(unprefixed, values);
                } else {
                    if(null == values[0] || values[0].length() == 0){
                        // 这里不做任何处理
                    }else{
                        params.put(unprefixed, values[0]);
                    }
                }
            }
        }
        return params;
    }
}
