package org.dromara.resource.junziqian.common;

import org.apache.commons.lang3.StringUtils;


/**
 * 基本工具类
 * @author yfx
 *
 */
public abstract class CommonUtil {

	/**
	 * 去空，null->''
	 *
	 * @param str
	 * @return
	 */
	public static String trim(String str, String def) {
		if (str == null || "null".equals(str.trim()) || "".equals(str.trim())) {
			return def;
		} else {
			return str.trim();
		}
	}

	/**
	 * 去空，null->''
	 *
	 * @param str
	 * @return
	 */
	public static String trim(String str) {
		if (str == null || "null".equals(str.trim())) {
			return "";
		} else {
			return str.trim();
		}
	}

	/**
	 * 去空,支持sql（发现为空时返回null）
	 *
	 * @param str
	 * @return
	 */
	public static String trimForSql(String str) {
		if (str == null || "".equals(str.trim()) || "null".equals(str.trim())) {
			return null;
		} else {
			return str.trim();
		}
	}

	/**
	 * 默认转换
	 *
	 * @param obj
	 * @param cla
	 * @return
	 */
	@SuppressWarnings("unchecked")
	public static <T> T parVal(Object obj, Class<T> cla) {
		if (cla.equals(String.class)) {
			if (obj == null || "".equals(obj + "") || "null".equals(obj)) {
				return (T) "";
			} else {
				return (T) (obj + "");
			}
		} else {
			try {
				if (obj == null)
					return null;
				if (cla.equals(Integer.class))
					return (T) Integer.valueOf(obj + "");
				if (cla.equals(Long.class))
					return (T) Long.valueOf(obj + "");
				if (cla.equals(Float.class))
					return (T) Float.valueOf(obj + "");
				if (cla.equals(Double.class))
					return (T) Double.valueOf(obj + "");
				if (cla.equals(Boolean.class))
					return (T) Boolean.valueOf(obj + "");
				return (T) obj;
			} catch (Exception e) {
				throw new RuntimeException("CommonUtil.parVal error|obj:" + obj+ ",class:" + cla);
			}
		}
	}

	/**
	 * 不返回错误的转换
	 *
	 * @param obj
	 * @param cla
	 * @return
	 */
	public static <T> T parValNoErr(Object obj, Class<T> cla) {
		try {
			return parVal(obj, cla);
		} catch (Exception e) {
			return null;
		}
	}

	/**
	 * 不返回错误的转换，为空或异常时返回默认值
	 * @param obj
	 * @param cla
	 * @param t
	 * @return
	 */
	public static <T> T parValNoErrDef(Object obj, Class<T> cla, T t) {
		try {
			T t1 = parVal(obj, cla);
			if (t1 == null || (cla.equals(String.class) && "".equals(t1))) {
				return t;
			}
			return t1;
		} catch (Exception e) {
			return t;
		}
	}

	/**
	 * 补位数据 ，前补0
	 * @param src
	 * @param length
	 * @return
	 */
	public static String conver0(Object src, int length) {
		if(src instanceof Number){
			return String.format("%0"+length+"d",src);
		}else if(src instanceof String){
			String str1=((String)src);
			if(str1.length()<length){
				return conver0(0,length-str1.length())+str1;
			}else{
				return str1;
			}
		}else{
			return src+"";
		}
	}

	/**
	 * 遮挡字符串
	 * 1、当字符串的长度小于总显示的位数时，将把字符串所有字符以*返回
	 * 2、当字符串的长度等于总显示的位数时，将把字符串前面位数显示后面位数以*拼接
	 * 3、当字符串的长度大于总显示的位数时，将把字符串前面与后面位数显示出来，中间以*拼接
	 * @param str
	 * @param a 字符串显示前几位
	 * @param b 字符串显示后几位
	 * @return
	 */
	public static String privacyStr(String str,int a,int b){
		if (StringUtils.isBlank(str)) {
			return null;
		}
		int length = str.length();
		String start = "";
		String end = "";
		String temp = "";
		int le = 0;
		int num = a+b;
		if (length<num) {
			le = length;
		}else if (length==num) {
			le = length-a;
			start = str.substring(0, a);
		}else if (length>num) {
			start = str.substring(0, a);
			end = str.substring(length-b);
			le = length-num;
		}
		for (int i = 0; i < le; i++) {
			temp+="*";
		}
		return start+temp+end;
	}


}
