package com.cr.common;

import com.cr.models.iNetDataModel;

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

import java.lang.reflect.Field;
import java.util.List;

/**
 * 作者:王成
 * 平台:MAC
 * 用户:wc
 * 创建日期: 2021/11/1 14:23
 * 描述:类解析管理器
 */
public class ClassManager {
    /**
     *
     * 描述: 转换类的全部字段内容 组合为JSONObject
     *
     * 作者: 王成
     * 创建日期: 2021/11/1 14:26
     * 操作系统: MAC
     * @param object 类实例
     * @return JSONObject
     */
    public static JSONObject fieldsToJSONObject(Object object){
        JSONObject jsonObj = new JSONObject();
        // TODO: 2022/9/9 加入本类
        toJSONObject(jsonObj,object);
        return jsonObj;
    }

    /**
     * 将类的字段加入JSONObject
     * @param jsonObj 接受字符串的JSONObject
     * @param object 类
     */
    private static void toJSONObject(JSONObject jsonObj,Object object){
        for(Field field : object.getClass().getDeclaredFields()){
            field.setAccessible(true);
            String fldName = field.getName();
            try {
                String fldValue = "";
                Class cls = field.getType();
                if(cls == String.class){
                    fldValue = (String)field.get(object);
                    jsonObj.put(fldName,fldValue);
                }else if(cls.isEnum()){
                    Object obj = field.get(object);
                }else if(iNetDataModel.class.isAssignableFrom(cls)){
                    iNetDataModel model = (iNetDataModel) field.get(object);
                    jsonObj.put(fldName,model.toJSON());
                } else if(cls.isAssignableFrom(List.class)){
                    // TODO: 2022/8/22 获取存储的数组
                    List<Object> value = (List<Object>)field.get(object);
                    if(value == null || value.size() == 0) continue;
                    // TODO: 2022/8/22 获取第一个值
                    Object fistValue = value.get(0);
                    // TODO: 2022/8/22 判断类型
                    Class clsSub = fistValue.getClass();
                    if(clsSub == String.class){
                        String outJSON = "";
                        for(Object obj :value){
                            if(outJSON.equals("")){
                                outJSON = String.format("\"%s\"",obj.toString());
                            }else{
                                outJSON += "," + String.format("\"%s\"",obj.toString());
                            }
                        }
                        jsonObj.put(fldName,String.format("[%s]",outJSON));
                    }else if(iNetDataModel.class.isAssignableFrom(clsSub)){
                        List<iNetDataModel> listValue = (List<iNetDataModel>)field.get(object);
                        jsonObj.put(fldName,JSONManager.transformToString(listValue));
                    }
                }
            } catch (IllegalAccessException e) {
                e.printStackTrace();
            }catch (JSONException e){
                e.printStackTrace();
            }
        }
    }
}
