package cn.com.ty.lift.common.utils;

import net.sourceforge.pinyin4j.PinyinHelper;

/**
 * <p>
 *     汉字转换拼音工具类
 * </p>
 *
 * @author wcz
 * @since  2018/5/9
 */
public class PinYinUtils {

    /**
     * 拼音中的声调字符"[1-5]"
     */
    private static final String PinYinChar = "[1-5]";
    /**
     * 空字符串""
     */
    private static final String EmptyChar  = "";
    private PinYinUtils(){}
    /**
     * 获取汉字首字母的方法。如： 张三 --> zs
     * 说明：暂时解决不了多音字的问题，只能使用取多音字的第一个音的方案
     *
     * @param chinese 汉字字符串
     * @return 大写汉子首字母; 如果都转换失败,那么返回null
     */
    public static String toFirstChar(String chinese) {
        return toHanyuPinyinString(chinese,false,false);
    }

    /**
     * 获取汉字首字母的方法。如： 张三 --> ZS
     * 说明：暂时解决不了多音字的问题，只能使用取多音字的第一个音的方案
     *
     * @param chinese 汉字字符串
     * @return 大写汉子首字母; 如果都转换失败,那么返回null
     */
    public static String toFirstCharUpper(String chinese){
        return toHanyuPinyinString(chinese,false,true);
    }

    /**
     * 获取汉字拼音的方法。如： 张三 --> zhangsan
     * 说明：暂时解决不了多音字的问题，只能使用取多音字的第一个音的方案
     *
     * @param chinese 汉字字符串
     * @return 汉字拼音; 如果都转换失败,那么返回null
     */
    public static String toPinYin(String chinese) {
        return toHanyuPinyinString(chinese,true,false);
    }
    /**
     * 获取汉字拼音的方法。如： 张三 --> ZHANGSAN
     * 说明：暂时解决不了多音字的问题，只能使用取多音字的第一个音的方案
     *
     * @param chinese 汉字字符串
     * @return 汉字拼音; 如果都转换失败,那么返回null
     */
    public static String toPinYinUpper(String chinese) {
        return toHanyuPinyinString(chinese,true,true);
    }

    /**
     * <p>
     *     获取汉字拼音的方法。如： 张三 --> zhangsan/ZHANGSAN/zs/ZS
     *     说明：暂时解决不了多音字的问题，只能使用取多音字的第一个音的方案
     * </p>
     * @param chinese       汉字字符串
     * @param fullySpell    true: 全拼, false: 首字母
     * @param toUpperCase   true: 大写, false: 小写
     * @return String       拼音字符串
     */
    private static String toHanyuPinyinString(String chinese, boolean fullySpell, boolean toUpperCase) {
        if (null == chinese || EmptyChar.equals(chinese.trim())) {
            return null;
        }
        char[] charArray = chinese.toCharArray();
        StringBuffer sb = new StringBuffer();
        //先判断，再循环转换
        if (fullySpell) {
            for (char ch : charArray) {
                // 逐个汉字进行转换， 每个汉字返回值为一个String数组（因为有多音字）
                String[] stringArray = PinyinHelper.toHanyuPinyinStringArray(ch);
                if (null != stringArray && stringArray.length > 0) {
                    // 把第几声这个数字给去掉
                    sb.append(stringArray[0].replaceAll(PinYinChar, EmptyChar));
                }
            }
        } else {
            for (char ch : charArray) {
                // 逐个汉字进行转换， 每个汉字返回值为一个String数组（因为有多音字）
                String[] stringArray = PinyinHelper.toHanyuPinyinStringArray(ch);
                if (null != stringArray && stringArray.length > 0) {
                    // 取首字母
                    sb.append(stringArray[0].charAt(0));
                }
            }
        }
        if(sb.length() == 0){
            return null;
        }
        if(toUpperCase){
            return sb.toString().toUpperCase();
        }else{
            return sb.toString();
        }
    }
}