package net.northking.cctp.testbug.util;

import net.northking.cctp.common.exception.PlatformRuntimeException;
import net.northking.cctp.testbug.constants.TestBugError;

import java.beans.Introspector;
import java.beans.PropertyDescriptor;
import java.lang.reflect.Method;
import java.util.*;

/**
 * @author: puchao.ma
 * @date: 2021/10/28 15:58
 */
public class CompareFieldsUtil {

    /**
     * 属性值比较
     * @param updateObj 修改的数据
     * @param compareObj 数据库数据
     * @param ignore    忽略的字段
     * @return
     * @throws Exception
     */
    public static Map<String, Object> compareFields(Object updateObj, Object compareObj, String ignore) {
        try {
            Map<String, Object> map = new HashMap<>();

            //  判断同一类型, 不是同一类，不能比较
            if (updateObj.getClass() != compareObj.getClass()) {
                return null;
            }

            Class<?> clazz = updateObj.getClass();
            //  获取object属性描述
            PropertyDescriptor[] pds = Introspector.getBeanInfo(clazz, Object.class).getPropertyDescriptors();
            for (PropertyDescriptor pd : pds) {
                //  属性名
                String name = pd.getName();
                //  如果当前属性选择忽略
                if (ignore.contains(name)) {
                    continue;
                }

                //  获取get方法，即可获取到属性值
                Method readMethod = pd.getReadMethod();
                //  获取o1的属性值
                Object o1 = readMethod.invoke(updateObj);
                //  获取o2的属性值
                Object o2 = readMethod.invoke(compareObj);

                if (Objects.nonNull(o1) && Objects.nonNull(o2)) {
                    //  比较两值是否相等,将修改的值放到map
                    if (!o1.equals(o2)) {
                        map.put(name, o1);
                    }
                }
            }
            return map;
        } catch (Exception e) {
            throw new PlatformRuntimeException(TestBugError.valueOf("添加缺陷变更记录:数据转换异常"));
        }
    }
}
