package easydo.technology.utils;

import java.util.*;

/**
 * 字符串工具类
 * 
 * @author Ready 2012-10-17
 */
public class StringUtil {

    /**
     * 如果字符串为空，则返回空字符""
     * 
     * @param str
     * @return
     */
    public static String stringNullToEmpty(String str) {
        return str == null ? "" : str;
    }

    /**
     * 如果字符串为空，则返回null
     * 
     * @param str
     * @return
     */
    public static String stringEmptyToNull(String str) {
        if (str == null)
            return null;
        return "".equals(str.trim()) ? null : str.trim();
    }

    public static String getPre(int count, String c) {
        StringBuilder result = new StringBuilder("");
        for (int i = 0; i < count; i++) {
            result.append(c);
        }
        return result.toString();
    }

    public static String disponseStr(String str) {
        if (str != null) {
            return str.trim();
        }
        return str;
    }

    /**
     * 是否为空，如果为null或者""，返回false，不为空返回true
     * 
     * @param target
     * @return
     */
    public static boolean isNotEmpty(Object target) {
        if (target == null || "".equals(target.toString().trim())
                || "null".equals(target.toString().toLowerCase().trim())) {
            return false;
        }
        return true;
    }

    /**
     * 判断字符串是否为空，如果为空返回true
     * 
     * @param target
     * @return
     */
    public static boolean isEmpty(Object target) {
        return !isNotEmpty(target);
    }

    /**
     * @author jchen.Kevin
     * @date 2015年04月04日
     * @description 生成长度为length的随机数
     * @exception 无
     * @param length是随机数长度
     * @return String
     * @version 1.0.0
     */
    public static String getRandom(int length) {
        if (length < 1) {
            return null;
        }
        StringBuffer str = new StringBuffer();
        Random random = new Random();
        for (int i = 0; i < length; i++) {
            str.append(String.valueOf(random.nextInt(10)));
        }
        return str.toString();
    }

    /**
     * @author lkang
     * @date 2014年5月27日
     * @description 生成长度为length的16进制字符串验证码
     * @exception 无
     * @param length是验证码长度
     * @return String
     * @version 1.0.0
     */
    public static String getValidateString(int length) {
        /*
         * 以时间为随机种子
         */
        Date d = new Date();
        long lseed = d.getTime();
        StringBuffer ramdomCode = new StringBuffer();
        Random r = new Random(lseed);

        /*
         * 产生16进制验证码字符串
         */
        for (int i = 0; i < length; i++) {
            ramdomCode.append(Integer.toHexString(r.nextInt(15)));
        }
        return ramdomCode.toString();
    }

    /**
     * @author lkang
     * @date 2014年5月27日
     * @description 生成长度为length的16进制数字验证码
     * @exception 无
     * @param length是验证码长度
     * @return String
     * @version 1.0.0
     */
    public static String getValidateNumber(int length) {
        /*
         * 以时间为随机种子
         */
        Date d = new Date();
        long lseed = d.getTime();
        StringBuffer ramdomCode = new StringBuffer();
        Random r = new Random(lseed);

        /*
         * 产生数字验证码
         */
        for (int i = 0; i < length; i++) {
            ramdomCode.append(Integer.toString(r.nextInt(9)));
        }
        return ramdomCode.toString();
    }

    /**
     * @author yldong.water
     * @date 2014年8月25日
     * @description 填充特定字符串以满足指定长度
     * @exception
     * @param source
     *            要填充的字符串
     * @param length
     *            字符串填充后满足的长度
     * @param fillString
     *            填充物
     * @return 填充后的字符串
     * @version 1.0.0
     */
    public static String fill(String source, int length, String fillString) {
        if (isNotEmpty(source)) {
            int sourceLength = source.length();
            if (sourceLength < length) {
                source = getPre(length - sourceLength, fillString) + source;
            }
        }
        else {
            source = getPre(length, fillString);
        }
        return source;
    }

    /**
     * 格式化文件大小
     * 
     * @param target
     * @return
     */
    public static String formatFileSize(double size) {
        size /= 1024;
        if (size >= 1024) {
            size /= 1024;
            double a = Math.round(size * 100);
            return a / 100 + "MB";
        }
        else {
            double a = Math.round(size * 100);
            return a / 100 + "KB";
        }
    }

    /**
     * 校验中英文的长度
     * 
     * @param target
     * @return
     */
    public static int lenString(String str) {
        if (isNotEmpty(str)) {
            int l = 0;
            for (int i = 0; i < str.length(); i++) {
                if (str.charAt(i) < 255) {
                    l++;
                }
                else {
                    l += 2;
                }
            }
            return l;
        }
        else {
            return 0;
        }
    }

    /**
     * 截取字符串
     * 
     * @param target
     * @return
     */
    public static String splitString(String str, int len, boolean flag) {
        if (isNotEmpty(str)) {
            if (lenString(str) > len) {
                int l = 0;
                int splitLen = 0;
                for (int i = 0; i < str.length(); i++) {
                    if (str.charAt(i) < 255) {
                        l++;
                    }
                    else {
                        l += 2;
                    }
                    if (l >= len) {
                        splitLen = i;
                        break;
                    }
                }
                if (flag) {
                    return str.substring(0, splitLen + 1);
                }
                else {
                    return str.substring(0, splitLen + 1) + "...";
                }
            }
            else {
                return str;
            }
        }
        else {
            return null;
        }
    }

    /**
     * @author jchen.Kevin
     * @date 2015年01月28日
     * @description 判断是否是固定电话
     * @param String
     * @return boolean
     * @version 1.0.0
     */
    public static boolean isTel(String str) {
        return str
                .matches("(^(\\d{3,4}-)?\\d{7,8})$|(13[0-9]{9})|(1[0-9]{10})");
    }

    /**
     * @author jchen.Kevin
     * @date 2015年01月28日
     * @description 判断是否是手机号码
     * @param String
     * @return boolean
     * @version 1.0.0
     */
    public static boolean isPhone(String str) {
        return str.matches("^1[0-9][0-9]\\d{8}$");
    }

    /**
     * @author jchen.Kevin
     * @date 2015年01月28日
     * @description 判断是否是邮箱
     * @param String
     * @return boolean
     * @version 1.0.0
     */
    public static boolean isEmail(String str) {
        return str
                .matches("^[A-Za-z\\d]+([-_.][A-Za-z\\d]+)*@([A-Za-z\\d]+[-.])+[A-Za-z\\d]{2,5}$");
    }

    /**
     * @author jchen.Kevin
     * @date 2015年01月28日
     * @description 判断是否是中国邮政编码(6位)
     * @param String
     * @return boolean
     * @version 1.0.0
     */
    public static boolean isZipCode(String str) {
        return str.matches("^[1-9][0-9]{5}$");
    }

    /**
     * @author jchen.Kevin
     * @date 2015年01月28日
     * @description 判断是否是腾讯QQ号
     * @param String
     * @return boolean
     * @version 1.0.0
     */
    public static boolean isQQ(String str) {
        return str.matches("[1-9][0-9]{4,}");
    }

    /**
     * @author jchen.Kevin
     * @date 2015年01月28日
     * @description 判断是否是身份证(15位或18位)
     * @param String
     * @return boolean
     * @version 1.0.0
     */
    public static boolean isIdcard(String str) {
        return str.matches("\\d{15}|\\d{18}");
    }


    /*
     * 得到两个数组中相同元素
     */
    public static Set<Integer> getSames(Integer[] a, Integer[] b) {
        Set<Integer> sames = new HashSet<Integer>();
        Set<Integer> set = new HashSet<Integer>(Arrays.asList(a));

        for (Integer i : b) {
            if (!set.add(i))
                sames.add(i);
        }

        return sames;
    }
    /*
    * 得到两个数组中相同元素
    */
    public static Set<Integer> getDefferent(Integer[] a, Integer[] b) {
        Set<Integer> defferents = new HashSet<Integer>();
        Set<Integer> set = new HashSet<Integer>(Arrays.asList(a));

        for (Integer i : b) {
            if (set.add(i))
                defferents.add(i);
        }

        return defferents;
    }

    /*
     * String数组转int数组
    */
    public static Integer[] StringToInt(String[] stringArr){
        Integer [] intArr = new Integer[stringArr.length];
        for(int i = 0; i < stringArr.length; i++){
            intArr[i] = Integer.parseInt(stringArr[i]);
        }
        return intArr;
    }
}
