package com.emr.util;

import java.lang.reflect.Field;
import java.lang.reflect.Method;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.HashMap;
import java.util.Locale;
import java.util.Map;

public class BeanFieldToValue {
	
	/**
     * 根据属性名获取属性值
     * 
     * @param fieldName
     * @param object
     * @return
     */
    public static String getFieldValueByFieldName(String fieldName, Object object) {
        try {
            Field field = object.getClass().getDeclaredField(fieldName);
            //设置对象的访问权限，保证对private的属性的访问
            field.setAccessible(true);
            return  field.get(object).toString();
        } catch (Exception e) {
            return null;
        } 
    }
	/** 
	 * 取Bean的属性和值对应关系的MAP 
	 * @param bean 
	 * @return Map 
	 */ 
	public static Map<String, String> getFieldValueMap(Object bean) {  
	    Class<?> cls = bean.getClass();  
	    Map<String, String> valueMap = new HashMap<String, String>();  
	    // 取出bean里的所有方法  
	    Method[] methods = cls.getDeclaredMethods();  
	    Field[] fields = cls.getDeclaredFields();  

	    for (Field field : fields) {  
	        try {  
	            String fieldType = field.getType().getSimpleName();  
	            String fieldGetName = parGetName(field.getName());  
	            if (!checkGetMet(methods, fieldGetName)) {  
	                continue;  
	            }  
	            Method fieldGetMet = cls.getMethod(fieldGetName, new Class[] {});  
	            Object fieldVal = fieldGetMet.invoke(bean, new Object[] {});  
	            String result = null;  
	            if ("Date".equals(fieldType)) {  
	                result = fmtDate((Date) fieldVal);  
	            } else {  
	                if (null != fieldVal) {  
	                    result = String.valueOf(fieldVal);  
	                }  
	            }  
	            valueMap.put(field.getName(), result);  
	        } catch (Exception e) {  
	            continue;  
	        }  
	    }  
	    return valueMap;  

	}  
	/** 
	 * set属性的值到Bean 
	 * @param bean 
	 * @param valMap 
	 */ 
	public static void setFieldValue(Object bean, Map<String, String> valMap) {  
	    Class<?> cls = bean.getClass();  
	    // 取出bean里的所有方法  
	    Method[] methods = cls.getDeclaredMethods();  
	    Field[] fields = cls.getDeclaredFields();  

	    for (Field field : fields) {  
	        try {  
	            String fieldSetName = parSetName(field.getName());  
	            if (!checkSetMet(methods, fieldSetName)) {  
	                continue;  
	            }  
	            Method fieldSetMet = cls.getMethod(fieldSetName, field.getType());  
	            String value = valMap.get(field.getName());  
	            if (null != value && !"".equals(value)) {  
	                String fieldType = field.getType().getSimpleName();  
	                if ("String".equals(fieldType)) {  
	                    fieldSetMet.invoke(bean, value);  
	                } else if ("Date".equals(fieldType)) {  
	                    Date temp = parseDate(value);  
	                    fieldSetMet.invoke(bean, temp);  
	                } else if ("Integer".equals(fieldType) || "int".equals(fieldType)) {  
	                    Integer intval = Integer.parseInt(value);  
	                    fieldSetMet.invoke(bean, intval);  
	                } else if ("Long".equalsIgnoreCase(fieldType)) {  
	                    Long temp = Long.parseLong(value);  
	                    fieldSetMet.invoke(bean, temp);  
	                } else if ("Double".equalsIgnoreCase(fieldType)) {  
	                    Double temp = Double.parseDouble(value);  
	                    fieldSetMet.invoke(bean, temp);  
	                } else if ("Boolean".equalsIgnoreCase(fieldType)) {  
	                    Boolean temp = Boolean.parseBoolean(value);  
	                    fieldSetMet.invoke(bean, temp);  
	                } else {  
	                    System.out.println("not supper type" + fieldType);  
	                }  
	            }  
	        } catch (Exception e) {  
	            continue;  
	        }  
	    }  

	}  

	/**
	 * 列名转属性名（驼峰）
	 * @param column
	 * @return
	 */
	public static String column2modelProperty(String column) {
		int i = column.indexOf("_");
		if(i == column.length() -1) {
			return column.substring(0, i);
		}
		if(i == -1) {
			return column;
		}
		if(i+2<column.length()) {
			column = column.substring(0, i)+column.substring(i+1, i+2).toUpperCase()+column.substring(i+2);
		} else {
			column = column.substring(0, i)+column.substring(i+1, i+2).toUpperCase();
		}
		if(column.indexOf("_") != -1) {
			return column2modelProperty(column);
		}
		return column;
	} 
	/** 
	 * 格式化string为Date 
	 * @param datestr 
	 * @return date 
	 */ 
	private static Date parseDate(String datestr) {  
	    if (null == datestr || "".equals(datestr)) {  
	        return null;  
	    }  
	    try {  
	        String fmtstr = null;  
	        if (datestr.indexOf(':') > 0) {  
	            fmtstr = "yyyy-MM-dd HH:mm:ss";  
	        } else {  
	            fmtstr = "yyyy-MM-dd";  
	        }  
	        SimpleDateFormat sdf = new SimpleDateFormat(fmtstr, Locale.UK);  
	        return sdf.parse(datestr);  
	    } catch (Exception e) {  
	        return null;  
	    }  
	}  
	/** 
	 * 日期转化为String 
	 * @param date 
	 * @return date string 
	 */ 
	private static String fmtDate(Date date) {  
	    if (null == date) {  
	        return null;  
	    }  
	    try {  
	        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss", Locale.US);  
	        return sdf.format(date);  
	    } catch (Exception e) {  
	        return null;  
	    }  
	}  

	/** 
	 * 判断是否存在某属性的 set方法 
	 * @param methods 
	 * @param fieldSetMet 
	 * @return boolean 
	 */ 
	private static boolean checkSetMet(Method[] methods, String fieldSetMet) {  
	    for (Method met : methods) {  
	        if (fieldSetMet.equals(met.getName())) {  
	            return true;  
	        }  
	    }  
	    return false;  
	}  
	/** 
	 * 判断是否存在某属性的 get方法 
	 * @param methods 
	 * @param fieldGetMet 
	 * @return boolean 
	 */ 
	private static boolean checkGetMet(Method[] methods, String fieldGetMet) {  
	    for (Method met : methods) {  
	        if (fieldGetMet.equals(met.getName())) {  
	            return true;  
	        }  
	    }  
	    return false;  
	}  

	/** 
	 * 拼接某属性的 get方法 
	 * @param fieldName 
	 * @return String 
	 */ 
	private static String parGetName(String fieldName) {  
	    if (null == fieldName || "".equals(fieldName)) {  
	        return null;  
	    }  
	    return "get" + fieldName.substring(0, 1).toUpperCase()  
	            + fieldName.substring(1);  
	}  
	/** 
	 * 拼接在某属性的 set方法 
	 * @param fieldName 
	 * @return String 
	 */ 
	private static String parSetName(String fieldName) {  
	    if (null == fieldName || "".equals(fieldName)) {  
	        return null;  
	    }  
	    return "set" + fieldName.substring(0, 1).toUpperCase()  
	            + fieldName.substring(1);  
	} 
}
