package com.cr.common;

import com.cr.models.iNetDataModel;

import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;

import java.util.*;

/**
 * 作者:王成
 * 平台:MAC
 * 用户:wc
 * 创建日期: 2021/7/29 11:17
 * 描述:JSON管理器
 */
public class JSONManager {
    /**
     * 网络交互正常 成功标识
     */
    private static String RES_OK = "RES_OK";
    /**
     * 网络交互正常 失败标识
     */
    private static String RES_NO = "RES_NO";
    /**
     * 网络交互正常 错误标识
     */
    private static String RES_ERR = "RES_ERR";

    /**
     * 将模型输出为JSON
     *
     * @param model 模型实例
     * @return JSON
     */
    public static String toJSON(iNetDataModel model) {
        String res = "{" + String.format("\"res\":\"%s\",\"data\":[%s]", RES_OK, model.toJSON()) + "}";
        return res;
    }

    /**
     * 字符串包装成JSON
     *
     * @param str 字符串
     * @return 包装后的内容
     */
    public static String strToJSON(String str) {
        String res = "{" + String.format("\"res\":\"%s\",\"data\":[%s]", RES_OK, str) + "}";
        return res;
    }

    /**
     * 将数据集输出JSON字符串
     *
     * @param modelList
     * @return
     */
    public static String toJSONToo(List<? extends iNetDataModel> modelList) {
        String res = "";
        StringBuilder jsonBuilder = new StringBuilder();
        for (iNetDataModel model : modelList) {
            if (jsonBuilder.length() == 0) {
                jsonBuilder.append(model.toJSON());
            } else {
                jsonBuilder.append(",").append(model.toJSON());
            }
        }
        if (modelList.size() > 0) {
            res = "{" + String.format("\"res\":\"%s\",\"data\":[%s]", RES_OK, jsonBuilder) + "}";
        } else {
            JSONObject obj = new JSONObject();
            try {
                obj.put("code", "1002");
                obj.put("msg", "未查询到符合条件的数据！");
            } catch (JSONException e) {
                e.printStackTrace();
            }
            res = "{" + String.format("\"res\":\"%s\",\"data\":[%s]", RES_NO, obj) + "}";
        }

        return res;
    }

    /**
     * 转换错误描述JSON
     *
     * @param errCode    错误代码
     * @param errMessage 错误内容
     * @return 错误描述JSON字符串
     */
    public static String toJSONError(String errCode, String errMessage) {
        JSONObject obj = new JSONObject();
        try {
            obj.put("code", errCode);
            obj.put("msg", errMessage);
        }catch (JSONException e){
            e.printStackTrace();
        }
        String res = "{" + String.format("\"res\":\"%s\",\"data\":[%s]", RES_ERR, obj) + "}";
        return res;
    }

    /**
     * 转换执行成功描述JSON
     *
     * @param errCode    代码
     * @param errMessage 内容
     * @return 成功描述JSON字符串
     */
    public static String toJSONSuccess(String errCode, String errMessage) {
        JSONObject obj = new JSONObject();
        try{
            obj.put("code", errCode);
            obj.put("msg", errMessage);
        }catch (JSONException e){
            e.printStackTrace();
        }
        String res = "{" + String.format("\"res\":\"%s\",\"data\":[%s]", RES_OK, obj) + "}";
        return res;
    }

    /**
     * 转换执行无数据描述JSON
     *
     * @param errCode    代码
     * @param errMessage 内容
     * @return 无数据描述JSON字符串
     */
    public static String toJSONNodata(String errCode, String errMessage) {
        JSONObject obj = new JSONObject();
        try{
            obj.put("code", errCode);
            obj.put("msg", errMessage);
        }catch (JSONException e){
            e.printStackTrace();
        }
        String res = "{" + String.format("\"res\":\"%s\",\"data\":[%s]", RES_NO, obj) + "}";
        return res;
    }

    /**
     * 获取int类型数值
     *
     * @param obj
     * @param keyName
     * @return
     */
    public static int getIntValue(JSONObject obj, String keyName) {
        try {
            String strVal = obj.getString(keyName);
            if (strVal.equals("")) return 0;
            else return Integer.valueOf(strVal);
        } catch (JSONException e) {
            e.printStackTrace();
        }
        return 0;
    }

    /**
     * 获取double类型数值
     *
     * @param obj
     * @param keyName
     * @return
     */
    public static double getDoubleValue(JSONObject obj, String keyName) {
        try {
            String strVal = obj.getString(keyName);
            if (strVal.equals("")) return 0;
            else return Double.valueOf(strVal);
        } catch (JSONException e) {
            e.printStackTrace();
        }
        return 0;
    }

    /**
     * 获取字符串
     *
     * @param obj
     * @param keyName
     * @return
     */
    public static String getStringValue(JSONObject obj, String keyName) {
        try {
            String strVal = obj.getString(keyName);
            return strVal;
        } catch (JSONException e) {
            e.printStackTrace();
        }
        return "";
    }

    /**
     * 获取布尔值
     *
     * @param obj
     * @param keyName
     * @return
     */
    public static boolean getBooleanValue(JSONObject obj, String keyName) {
        try {
            String strVal = obj.getString(keyName);
            return strVal.equals("1") || strVal.equals("true") ? true : false;
        } catch (JSONException e) {
            e.printStackTrace();
        }
        return false;
    }

    /**
     * 获取JSON
     *
     * @param obj
     * @param keyName
     * @return
     */
    public static JSONObject getJSONObjValue(JSONObject obj, String keyName) {
        JSONObject resObj = null;
        resObj = obj.optJSONObject(keyName);
        return resObj;
    }

    /**
     * 获取JSON数组
     *
     * @param obj
     * @param keyName
     * @return
     */
    public static JSONArray getJSONArrayValue(JSONObject obj, String keyName) {
        JSONArray resObj = null;
        resObj = obj.optJSONArray(keyName);
        return resObj;
    }

    /**
     * 通过Map和Key获取字符串值
     *
     * @param map          map 数据集
     * @param key          key 关键字
     * @param defaultValue 默认值
     * @return 获取的字符串
     */
    public static <T> String getStringByMap(Map<String, T> map, String key, String defaultValue) {
        if (map.get(key) == null) return "";
        else return map.get(key).toString();
    }


    /**
     * 将List数据集转换为JSON数组
     *
     * @param dataList 数据集
     * @return JSON数组
     */
    public static String transformToString(List<? extends iNetDataModel> dataList) {
        StringBuilder resBuilder = new StringBuilder();
        for (iNetDataModel model : dataList) {
            if (resBuilder.length() == 0) resBuilder.append(model.toJSON());
            else resBuilder.append(",").append(model.toJSON());
        }
        return String.format("[%s]", resBuilder);
    }
}
