package com.ym.mec.util.string;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;

import org.apache.commons.beanutils.ConvertUtils;
import org.apache.commons.lang3.ArrayUtils;
import org.apache.commons.lang3.StringUtils;

public class ValueUtil {

	/** 
	 * 将emoji表情替换成* 
	 *  
	 * @param source 
	 * @return 过滤后的字符串 
	 */
	public static String filterEmoji(String source) {
		if (StringUtils.isNotBlank(source)) {
			return source.replaceAll("[\\ud800\\udc00-\\udbff\\udfff\\ud800-\\udfff]", "*");
		} else {
			return source;
		}
	}

	/**
	 * 字符串模糊化
	 * @param str
	 * @return
	 */
	public static String fuzzyString(String str) {
		if (StringUtils.isBlank(str)) {
			return str;
		}
		int length = str.length() - 1;
		if (length == 0) {
			return str + "**";
		}
		return str.charAt(0) + "**" + str.charAt(length);

	}

	/**
	 * 银行卡模糊化
	 * @param str
	 * @return
	 */
	public static String fuzzyBankCard(String str) {
		if (StringUtils.isBlank(str)) {
			return str;
		}
		return str.substring(0, 4) + "******" + str.substring(str.length() - 4);

	}

	/**
	 * 身份证模糊化
	 * @param str
	 * @return
	 */
	public static String fuzzyIdCard(String str) {
		if (StringUtils.isBlank(str)) {
			return str;
		}
		return str.charAt(0) + "*******" + str.substring(str.length() - 4);

	}

	/**
	 * 邮箱模糊化
	 * @param str
	 * @return
	 */
	public static String fuzzyEmail(String str) {
		if (StringUtils.isBlank(str)) {
			return str;
		}
		return str.charAt(0) + "*****" + str.substring(StringUtils.lastIndexOf(str, '.'));

	}

	/**
	 * 手机号码模糊化
	 * @param str
	 * @return
	 */
	public static String fuzzyMobile(String str) {
		if (StringUtils.isBlank(str)) {
			return str;
		}
		return str.substring(0, 3) + "****" + str.substring(7);

	}

	/**
	 * 连接Map键值对
	 * 
	 * @param map
	 *            Map
	 * @param prefix
	 *            前缀
	 * @param suffix
	 *            后缀
	 * @param separator
	 *            连接符
	 * @param ignoreEmptyValue
	 *            忽略空值
	 * @param ignoreKeys
	 *            忽略Key
	 * @return 字符串
	 */
	public static String joinKeyValue(Map<String, Object> map, String prefix, String suffix, String separator, boolean ignoreEmptyValue, String... ignoreKeys) {
		List<String> list = new ArrayList<String>();
		if (map != null) {
			for (Entry<String, Object> entry : map.entrySet()) {
				String key = entry.getKey();
				String value = ConvertUtils.convert(entry.getValue());
				if (StringUtils.isNotEmpty(key) && !ArrayUtils.contains(ignoreKeys, key) && (!ignoreEmptyValue || StringUtils.isNotEmpty(value))) {
					list.add(key + "=" + (value != null ? value : ""));
				}
			}
		}
		return (prefix != null ? prefix : "") + StringUtils.join(list, separator) + (suffix != null ? suffix : "");
	}

	/**
	 * 连接Map值
	 * 
	 * @param map
	 *            Map
	 * @param prefix
	 *            前缀
	 * @param suffix
	 *            后缀
	 * @param separator
	 *            连接符
	 * @param ignoreEmptyValue
	 *            忽略空值
	 * @param ignoreKeys
	 *            忽略Key
	 * @return 字符串
	 */
	public static String joinValue(Map<String, Object> map, String prefix, String suffix, String separator, boolean ignoreEmptyValue, String... ignoreKeys) {
		List<String> list = new ArrayList<String>();
		if (map != null) {
			for (Entry<String, Object> entry : map.entrySet()) {
				String key = entry.getKey();
				String value = ConvertUtils.convert(entry.getValue());
				if (StringUtils.isNotEmpty(key) && !ArrayUtils.contains(ignoreKeys, key) && (!ignoreEmptyValue || StringUtils.isNotEmpty(value))) {
					list.add(value != null ? value : "");
				}
			}
		}
		return (prefix != null ? prefix : "") + StringUtils.join(list, separator) + (suffix != null ? suffix : "");
	}

	public static Map<String, String> splitKeyValue(String str, String separator) {
		Map<String, String> result = new HashMap<String, String>();

		String[] strs = str.split(separator);
		String[] kv = null;
		for (String s : strs) {
			kv = s.split("=");

			if (kv.length == 2) {
				result.put(kv[0], kv[1]);
			}
		}

		return result;
	}

	public static String[] splitValue(String str, String separator) {
		String[] strs = str.split(separator);
		return strs;
	}
}
