package com.persagy.framework.util;

import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.util.ArrayList;
import java.util.Collection;
import java.util.List;
import java.util.Map;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

import org.apache.commons.collections.CollectionUtils;

import com.thoughtworks.xstream.core.util.Base64Encoder;

/**
 * 
 * <p> StringUtils.java.</p>
 * <p>Description: 字符串的方法 .</p>
 * <p>Company: .</p>
 * <p> @author <a href="mail to:xubin_1009@sina.com">xubin</a></p>
 * <p> @since 2018年3月29日: 下午3:31:57 </p>
 * <p> @version .</p>
 */
/**
 * <p> StringUtils.java.</p>
 * <p>Description:  .</p>
 * <p>Company: .</p>
 * <p> @author <a href="mail to:xubin_1009@sina.com">xubin</a></p>
 * <p> @since 2018年3月29日: 下午3:35:12 </p>
 * <p> @version .</p>
 */
@SuppressWarnings("rawtypes")
public final class StringUtils {
	
	/**  <p> 提供空字符串.</p> */
	public static final java.lang.String EMPTY = "";
	
	/**
	 * Description: 可切割字符串转List<Double>集合
	 * @param str 可切割字符串，如"1,2,3,4"或"1.5;2.5;0.5",允许含空格，如"1, 2, 3 , 4"
	 * @param regex 切割符号如","或";", 默认值为","
	 * @return List<Double> 参数字符串str为null，返回null；str为空格字符串或空字符串返回空集合
	 * @throws Exception 
	 * @author cuixubin
	 * @since 2018年11月29日: 上午10:36:08
	 */
	public static List<Double> getDoubleListFromStr(String str, String regex) throws Exception{
		regex = regex == null ? "," : regex;
		
		List<Double> result = null;
		
		if(null == str) {
			return result;
		}
		
		result = new ArrayList<>();
		
		if(!isBlank(str)) {
			
			for(String numStr : str.replace(" ", "").split(regex)) {
				try {
					result.add(Double.valueOf(numStr));
				}catch (Exception e) {
					result.add(null);
				}
			}
		}
		
		return result;
	}
	
	/**
	 * Description: 将数值集合转为字符串，元素按英文逗号,分割
	 * @param list 元素为数值格式集合
	 * @return 参数list为null返回null,为空集合返回空字符串""
	 * @throws Exception String
	 * @author cuixubin
	 * @since 2018年11月29日: 上午10:44:50
	 */
	public static <T extends Number>  String getStrFromNumberList(List<T> list) throws Exception {
		return list == null ? null : list.toString().replace("[", "").replace("]", "").replace(" ", "");
	}
	
	/**
	 * Description: 判断字符串是否为null，或者是空串"", 或者是空格串"  "
	 * @param str
	 * @return boolean
	 * @author cuixubin
	 * @since 2018年8月20日: 下午1:26:25
	 * Update By cuixubin 2018年8月20日: 下午1:26:25
	 */
	public static final boolean isBlank(String str) {
		if(isEmpty(str)) {
			return true;
		}
		
		return str.trim().length() == 0;
	}
	
	/**
	 * Description: 如果源字符串str为null,空串或空格串则返回默认字符串
	 * @param str 源字符串
	 * @param defStr 默认字符串
	 * @return String
	 * @author cuixubin
	 * @since 2018年8月20日: 下午1:28:52
	 * Update By cuixubin 2018年8月20日: 下午1:28:52
	 */
	public static String getDefault(String str, String defStr) {
		return isBlank(str) ? defStr : str;
	}

	/**
	 *<p>Description:判断字符串是否为null，或者是空串""  .</p> 
	 *<p> @param s
	 *<p> @return boolean
	 * @since 2018年3月29日: 下午3:34:03
	 * @author <a href="mail to:xubin_1009@sina.com">xubin</a>
	 * @version 1.0
	 */
	public static final boolean isEmpty(String s) {
		return (s == null || s.length() == 0);
	}
	/**
	 *<p>Description: 判断字符串是否不为null，且不是空串"" .</p> 
	 *<p> @param s
	 *<p> @return boolean
	 * @since 2018年3月29日: 下午3:34:14
	 * @author <a href="mail to:xubin_1009@sina.com">xubin</a>
	 * @version 1.0
	 */
	public static final boolean isNotEmpty(String s) {
		return !isEmpty(s);
	}
	public static final String toString(Object o) {
		return o != null ? o.toString() : null;
	}

	 /**
	 *<p>Description:判断是否为空串  .</p> 
	 *<p>@param cs
	 *<p>@return boolean
	 *@since 2017年5月3日: 上午10:39:23
	 *@author xubin
	 *@version 1.0
	 */
	public static boolean isBlank(CharSequence cs) {
		if (null == cs)
			return true;
		int length = cs.length();
		for (int i = 0; i < length; i++) {
			if (!Character.isWhitespace(cs.charAt(i)))
				return false;
		}
		return true;
	}
	
	/**
	 *<p>Description: 比较字符串是否相等，都为null时，返回true .</p> 
	 *<p> @param string1
	 *<p> @param string2
	 *<p> @return boolean
	 * @since 2018年3月29日: 下午3:34:37
	 * @author <a href="mail to:xubin_1009@sina.com">xubin</a>
	 * @version 1.0
	 */
	public static boolean equalsWithNull(String string1, String string2) {
		if (string1 == null) {
			if (string2 == null) {
				return true;
			} else {
				return false;
			}
		} else {
			return string1.equals(string2);
		}
	}
	
	public static boolean checkIsPhone(String phonenumber) {
		String phone = "(^(d{3,4}-)?d{7,8})$|(1[0-9]{10})";
		String tregEx = "[0-9]{7,8}"; // 表示a或f 0832-80691990
		Pattern p = Pattern.compile(phone);
		Matcher m = p.matcher(phonenumber);
		Pattern p2 = Pattern.compile(tregEx);
		Matcher m2 = p2.matcher(phonenumber);
		// String regEx="[1]{1}[3,5,8,6]{1}[0-9]{9}"; //手机
		// String tregEx="[0]{1}[0-9]{2,3}-[0-9]{7,8}"; //表示a或f 0832-80691990
		return m.matches() || m2.matches();
	}
	
	/**
	 *<p>Description: 判断字符串中是否包含汉字，如字符串为空，返回false .</p> 
	 *<p> @param str
	 *<p> @return boolean
	 * @since 2018年3月29日: 下午3:35:01
	 * @author <a href="mail to:xubin_1009@sina.com">xubin</a>
	 * @version 1.0
	 */
	public static boolean hasHanZi(String str) {
		if (StringUtils.isEmpty(str)) {
			return false;
		}
		String regEx = "[\\u4e00-\\u9fa5]";

		Pattern pat = Pattern.compile(regEx);
		Matcher mat = pat.matcher(str);
		return mat.find();

	}
	
	/**
	 *<p>Description:  .</p> 
	 *<p> @param str
	 *<p> @return String
	 * @since 2018年3月29日: 下午3:35:17
	 * @author <a href="mail to:xubin_1009@sina.com">xubin</a>
	 * @version 1.0
	 */
	public static String spriceNumberic(String str) {
		StringBuffer sb = new StringBuffer();
		if (str != null) {
			for (int i = 0; i < str.length(); i++) {
				if (Character.isDigit(str.charAt(i))) {
					sb.append("*");
				} else {
					sb.append(str.charAt(i));
				}
			}
		}
		return sb.toString();

	}
	  
	/**
	 *<p>Description:  根据id的集合拼接成用于SQL中in条件的串 .</p> 
	 *<p> @param ids
	 *<p> @return String
	 * @since 2018年3月29日: 下午3:35:32
	 * @author <a href="mail to:xubin_1009@sina.com">xubin</a>
	 * @version 1.0
	 */
	public static String createIdsForSQL(Collection<String> ids) {
		  String[] idsArr = null;
		  if (ids != null){
			  idsArr = ids.toArray(new String[0]);
		  }
		  return createIdsForSQL(idsArr);
	  }
	  
	/**
	 *<p>Description: 根据String[]拼接成用于SQL中in条件的串 .</p> 
	 *<p> @param ids
	 *<p> @return String
	 * @since 2018年3月29日: 下午3:36:13
	 * @author <a href="mail to:xubin_1009@sina.com">xubin</a>
	 * @version 1.0
	 */
	public static String createIdsForSQL(String[] ids) {
		if (ids == null || ids.length == 0) {
			return "'-9999'";
		}
		StringBuffer buffer = new StringBuffer();
		for (String tmp : ids) {
			if (buffer.length() > 0) {
				buffer.append(",");
			}
			buffer.append("'" + tmp + "'");
		}
		return buffer.toString();
	}
	
	 /**
	 *<p>Description: 去除字符里包含的回车(\n)、水平制表符(\t)、空格(\s)、换行(\r) .</p> 
	 *<p>@param str
	 *<p>@return String 
	 */
	public static String replaceSpecilSign(String str) {
		String dest = "";
		if (isNotEmpty(str)) {
			Pattern p = Pattern.compile("\\s*|\t|\r|\n");

			Matcher m = p.matcher(str);

			dest = m.replaceAll("");
		}
		return dest;
	}

	/**
	 *<p>Description: 判断一个字符串是否为数字型字符串 .</p> 
	 *<p>@param str
	 *<p>@return boolean 
	 */
	public static boolean isNumberic(String str) {
		if (isEmpty(str)) {
			return false;
		}
		Pattern pattern = Pattern.compile("[0-9]*");
		return pattern.matcher(str).matches();
	}
	/**
	 *<p>Description: 目标字符是否包含正则表达式所给字符 .</p> 
	 *<p>@param destStr 目标字符
	 *<p>@param regEx 正则表达式
	 *<p>@return boolean 
	 */
	public static boolean containString(String destStr,String regEx){
		if(isEmpty(destStr)){
			return false;
		}
		if(isEmpty(regEx)){
			return false;
		}
		Pattern p = Pattern.compile(regEx);
		Matcher m = p.matcher(destStr);
		return m.find();
	}
	
	/**
	 *<p>Description:  .</p> 
	 *<p> @param fileName
	 *<p> @return boolean
	 * @since 2018年3月29日: 下午3:36:36
	 * @author <a href="mail to:xubin_1009@sina.com">xubin</a>
	 * @version 1.0
	 */
	public static boolean isFileName(String fileName) {
		boolean flag =false;
		if(isEmpty(fileName)){
			return false;
		}
		if(fileName.indexOf("*")>=0){
			return true;
		}
		if(fileName.indexOf("\\")>=0){
			return true;
		}
		if(fileName.indexOf("/")>=0){
			return true;
		}
		if(fileName.indexOf("?")>=0){
			return true;
		}
		if(fileName.indexOf(":")>=0){
			return true;
		}
		if(fileName.indexOf("<")>=0){
			return true;
		}
		if(fileName.indexOf(">")>=0){
			return true;
		}
		if(fileName.indexOf("\"")>=0){
			return true;
		}
		if(fileName.indexOf("|")>=0){
			return true;
		}
		return flag;
		
	}
	/**
     * 
     *<p>Description:将字符串首字母大写  .</p> 
     *<p>@param s
     *<p>@return String
     *@since 2014 10:13:02 AM
     *@author xubin
     *@version 1.0
     */
	public static String capitalize(CharSequence s) {
		if (null == s)
			return null;
		int len = s.length();
		if (len == 0)
			return "";
		char char0 = s.charAt(0);
		if (Character.isUpperCase(char0))
			return s.toString();
		return new StringBuilder(len).append(Character.toUpperCase(char0))
				.append(s.subSequence(1, len)).toString();
	}

	/**
     * 判断String是否为null或空
     * @param params
     * @return
     */
    public static boolean isNull(String... params){
        for(String param : params){
            if(param == null || "".equals(param)){
                return true;
            }
        }
        return false;
    }

    /**
     * 判断dto是否包含parmas中的字段
     * @param dto
     * @param params
     * @return
     */
    public static boolean isNull(Map dto, String... params){
        for(String param : params){
            if(isNull((String)dto.get(param))){
                return true;
            }
        }
        return false;
    }

    /**
     * 判断dto中时候包含parmas中字段的为空数组
     * @param dto
     * @param params
     * @return
     */
	public static boolean isEmptyList(Map dto, String... params){
        List destList;
        for(String param : params){
        	destList = (List)dto.get(param);
            if(destList == null || destList.isEmpty()){
                return true;
            }
        }
        return false;
    }
	/**
	 * 判断dto中时候包含parmas中字段的为空Map
	 * @param dto
	 * @param params
	 * @return
	 */
	public static boolean isEmptyMap(Map dto, String... params){
		Map destMap;
		for(String param : params){
			destMap = (Map)dto.get(param);
			if(null == destMap || CollectionUtils.isEmpty(destMap.keySet())){
				return true;
			}
		}
		return false;
	}
	/**
	  * 序列化对象为String字符串
	  * @param o Object
	  * @return String
	  * @throws Exception
	  */
	 public static String writeObject(Object o) throws Exception {
	  ByteArrayOutputStream bos = new ByteArrayOutputStream();
	  ObjectOutputStream oos = new ObjectOutputStream(bos);
	  oos.writeObject(o);
	  oos.flush();
	  oos.close();
	  bos.close();
	  return new Base64Encoder().encode(bos.toByteArray());
	 }

	 /**
	  * 反序列化字符串为对象
	  * @param object String
	  * @return
	  * @throws Exception
	  */
	 public static Object readObject(String object) throws Exception{
	 Base64Encoder base64Encoder = new Base64Encoder();
	  ByteArrayInputStream bis = new ByteArrayInputStream(base64Encoder.decode(object));
	     ObjectInputStream ois = new ObjectInputStream(bis);
	     Object o = ois.readObject();
	     bis.close();
	     ois.close();
	     return o;
	 }
}
