package com.palmnest.webapp.controller.utils;

import lombok.extern.slf4j.Slf4j;

import java.lang.reflect.AccessibleObject;
import java.lang.reflect.Field;
import java.lang.reflect.Modifier;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
import java.util.Map.Entry;


@Slf4j
public class ObjUtils {


	public ObjUtils() {
	}

	public static Object getFieldValue(Object obj, Class<?> clazz, String fieldName) {
		if (obj != null && fieldName != null && clazz != null) {
			try {
				Field field = clazz.getDeclaredField(fieldName);
				if (field == null) {
					return null;
				} else {
					field.setAccessible(true);
					return field.get(obj);
				}
			} catch (Throwable var4) {
				log.error("get object field value fail." + clazz.getName() + "#" + fieldName, var4);
				return null;
			}
		} else {
			return null;
		}
	}

	public static Object getFieldValue(Object obj, String fieldName) {
		if (obj != null && fieldName != null) {
			for (Class clazz = obj.getClass(); clazz != null; clazz = clazz.getSuperclass()) {
				Object value = getFieldValue(obj, clazz, fieldName);
				if (value != null) {
					return value;
				}
			}

			return null;
		} else {
			return null;
		}
	}

	public static Map<String, Object> obj2Map(Object obj, boolean expandMapField) {
		Map<String, Object> map = new HashMap();
		return obj2Map(obj, expandMapField, map);
	}

	public static Map<String, Object> obj2Map(Object obj, boolean expandMapField, Map<String, Object> map) {
		if (obj != null && map != null) {
			for (Class clazz = obj.getClass(); clazz != null; clazz = clazz.getSuperclass()) {
				Field[] fields = clazz.getDeclaredFields();
				objField2Map(obj, fields, expandMapField, map);
			}

			return map;
		} else {
			return null;
		}
	}

	public static void objField2Map(Object obj, Field[] fields, boolean expandMapField, Map<String, Object> map) {
		if (obj != null && fields != null && map != null) {
			AccessibleObject.setAccessible(fields, true);
			Field[] arr$ = fields;
			int     len$ = fields.length;

			for (int i$ = 0; i$ < len$; ++i$) {
				Field field = arr$[i$];

				try {
					if (isCanReflect(field)) {
						String fieldName = field.getName();
						Object value     = field.get(obj);
						if (value != null) {
							if (value instanceof Map && expandMapField) {
								Map      mpObj = (Map) value;
								Iterator it    = mpObj.entrySet().iterator();

								while (it.hasNext()) {
									Entry entry = (Entry) it.next();
									if (entry.getKey() != null) {
										map.put(entry.getKey().toString(), entry.getValue());
									}
								}
							} else {
								map.put(fieldName, value);
							}
						}
					}
				} catch (Throwable var13) {
					log.debug("object fields reflect to  map fail", var13);
				}
			}

		}
	}

//	    public static String obj2String(Object obj) {
//	        return (new Obj2StrBuilder()).reflectionToString(obj);
//	    }
//
//	    public static String obj2String(Object obj, boolean reflectCollection, boolean reflectMap, boolean reflectArray) {
//	        return (new Obj2StrBuilder(reflectCollection, reflectArray, reflectArray)).reflectionToString(obj);
//	    }

//	    public static String obj2Json(Object obj, boolean sensitiveDataSafe, int maxCollLen, int limitTextLen) {
//	        ObjectMapper mapper = getObjectMapper(sensitiveDataSafe, maxCollLen, limitTextLen);
//
//	        try {
//	            return mapper.writeValueAsString(obj);
//	        } catch (JsonProcessingException var6) {
//	            log.error("obj2Json failed", var6);
//	            return null;
//	        }
//	    }

//	    protected static ObjectMapper getObjectMapper(boolean sensitiveDataSafe, int maxCollLen, int limitTextLen) {
//	        ObjectMapper objMapper = new ObjectMapper();
//	        SimpleModule module = new SimpleModule();
//	        if (maxCollLen >= 0) {
//	            module.setSerializers(new SimpleCollectionTypeSerializers());
//	        }
//
//	        if (sensitiveDataSafe || limitTextLen > 0) {
//	            SpecStringSerializer strSer = new SpecStringSerializer();
//	            if (limitTextLen > 0) {
//	                strSer.setOutTextLen(limitTextLen);
//	            }
//
//	            module.addSerializer(strSer);
//	        }
//
//	        objMapper.registerModule(module);
//	        return objMapper;
//	    }
//
//	    public static String obj2QueryString(Object obj) {
//	        return (new Obj2StrBuilder()).reflectionToKV(obj);
//	    }

	protected static boolean isCanReflect(Field field) {
		if (field.getName().indexOf(36) != -1) {
			return false;
		} else if (Modifier.isTransient(field.getModifiers())) {
			return false;
		} else {
			return !Modifier.isStatic(field.getModifiers());
		}
	}

//	    public static void main(String[] args) {
//	        class Test {
//	            private String listid;
//	            private String spid;
//	            private MyInput ad;
//
//	            public Test(String a1, String a2) {
//	                this.listid = a1;
//	                this.spid = a2;
//	                this.ad = new MyInput();
//	                this.ad.setA("a1");
//	                this.ad.setB("a2");
//	            }
//	        }
//
//	        Test t1 = new Test("1111", "44rr");
//	        System.out.println(obj2String(t1));
//	        Test[] ad = new Test[]{new Test("a1", "dds"), null};
//	        System.out.println(obj2String(ad, true, true, true));
//
//	        class MyInput implements Serializable {
//	            private static final long serialVersionUID = 1L;
//	            private String a;
//	            private String b;
//
//	            public String getA() {
//	                return this.a;
//	            }
//
//	            public void setA(String a) {
//	                this.a = a;
//	            }
//
//	            public String getB() {
//	                return this.b;
//	            }
//
//	            public void setB(String b) {
//	                this.b = b;
//	            }
//
//	            public MyInput() {
//	            }
//	        }
//
//	    }
}
