package cn.com.capcloud.api.action.service.util;

import cn.com.capcloud.ccui.core.common.json.JackJSON;
import cn.com.capcloud.core.util.sm.SM2Utils;
import cn.com.capcloud.core.util.sm.Util;
import net.sourceforge.pinyin4j.PinyinHelper;
import net.sourceforge.pinyin4j.format.HanyuPinyinCaseType;
import net.sourceforge.pinyin4j.format.HanyuPinyinOutputFormat;
import net.sourceforge.pinyin4j.format.HanyuPinyinToneType;
import net.sourceforge.pinyin4j.format.exception.BadHanyuPinyinOutputFormatCombination;

import java.io.IOException;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Random;

/**
 * @Author LiaoJiaHui
 * @Create 2026/4/27
 */
public class TextUtil {

    /**
     * html解码器
     */
    public static String htmlDecode(String text) {
        Map<String, String> htmlEntities = getHtmlEntities();
        for (Map.Entry<String, String> entry : htmlEntities.entrySet()) {
            text = text.replace(entry.getKey(), entry.getValue());
        }
        return text;
    }
    /**
     * html转码器
     */
    public static String htmlEncode(String text) {
        Map<String, String> htmlEntities = getHtmlEntities();
        for (Map.Entry<String, String> entry : htmlEntities.entrySet()) {
            text = text.replace(entry.getValue(), entry.getKey());
        }
        return text;
    }

    public static Map<String, String> getHtmlEntities() {
        Map<String, String> htmlEntities = new HashMap<>();
        htmlEntities.put("&nbsp;", " ");
        htmlEntities.put("&quot;", "\'");
        htmlEntities.put("&lt;", "<");
        htmlEntities.put("&gt;", ">");
        return htmlEntities;
    }

    /**
     * 生成指定长度随机密码
     * @param len 生成的密码的总长度
     * @return  密码的字符串
     */
    public static String getRandomNum(int len){
        //77是因为数组是从0开始的，52个字母+10个数字+10个特殊字符
        final int  maxNum = 72;
        int i;  //生成的随机数
        int count = 0; //生成的密码的长度
        StringBuffer buf = new StringBuffer("a,b,c,d,e,f,g,h,i,g,k,l,m,n,o,p,q,r,s,t,u,v,w,x,y,z");
        buf.append(",A,B,C,D,E,F,G,H,I,G,K,L,M,N,O,P,Q,R,S,T,U,V,W,X,Y,Z");
        buf.append(",!,@,#,$,%,^,&,*,(,)");
        buf.append(",1,2,3,4,5,6,7,8,9,0");
        String[] arr = buf.toString().split(",");

        StringBuffer pwd = new StringBuffer();
        Random r = new Random();
        while(count < len){
            //生成随机数，取绝对值，防止生成负数，
            i = Math.abs(r.nextInt(maxNum));  //生成的数最大为36-1
            if (i >= 0 && i < arr.length) {
                pwd.append(arr[i]);
                count ++;
            }
        }
        return pwd.toString();
    }

    /**
     * 将对象中的所有 null 值转为空字符串
     * @param obj 需要处理的对象，可以是 Map、List 或其他类型
     * @return 转换后的 JSON 字符串
     */
    public static String nullToStrFilter(Object obj) {
        // 调用 convert 方法进行 null 转换
        convert(obj);
        // 返回转换后的 JSON 字符串
        return JackJSON.toJSONString(obj);
    }

    /**
     * 递归遍历对象，处理 Map 和 List 中的 null 值
     * @param obj 需要处理的对象
     */
    private static void convert(Object obj) {
        if (obj == null) return;

        if (obj instanceof Map) {
            convertMap((Map<String, Object>) obj);
        } else if (obj instanceof List) {
            convertList((List<Object>) obj);
        }
    }



    /**
     * 递归处理 Map 中的 null 值
     * @param map Map 对象
     */
    private static void convertMap(Map<String, Object> map) {
        for (Map.Entry<String, Object> entry : map.entrySet()) {
            if (entry.getValue() == null) {
                entry.setValue("");  // 将 null 值替换为空字符串
            } else if (entry.getValue() instanceof Map) {
                convertMap((Map<String, Object>) entry.getValue());  // 递归处理嵌套的 Map
            } else if (entry.getValue() instanceof List) {
                convertList((List<Object>) entry.getValue());  // 递归处理嵌套的 List
            }
        }
    }

    /**
     * 递归处理 List 中的 null 值
     * @param list List 对象
     */
    private static void convertList(List<Object> list) {
        for (int i = 0; i < list.size(); i++) {
            Object item = list.get(i);
            if (item == null) {
                list.set(i, "");  // 将 null 值替换为空字符串
            } else if (item instanceof Map) {
                convertMap((Map<String, Object>) item);  // 递归处理嵌套的 Map
            } else if (item instanceof List) {
                convertList((List<Object>) item);  // 递归处理嵌套的 List
            }
        }
    }





    /**
     * 中文转拼音 不分割
     */
    public static String chineseToPinyin(String chinese){
        return chineseToPinyin(chinese,"");
    }



    /**
     * 中文转拼音 允许传分隔符
     */
    public static String chineseToPinyin(String chinese,String separate){
        HanyuPinyinOutputFormat format = new HanyuPinyinOutputFormat();
        //拼音小写
        format.setCaseType(HanyuPinyinCaseType.LOWERCASE);
        //不带声调
        format.setToneType(HanyuPinyinToneType.WITHOUT_TONE);
        try {
            //参数解释：要转换的中文，格式，转换之后的拼音的分隔符，遇到不能转换的是否保留
            return PinyinHelper.toHanYuPinyinString(chinese, format, separate, true);
        } catch (BadHanyuPinyinOutputFormatCombination badHanyuPinyinOutputFormatCombination) {
            return "";
        }
    }

    /**
     * @param str 加密字符串
     */
    public static String smEncrypt(String str,String pubKey) {
        String cipherText ="";
        try {
            byte[] sourceData = str.getBytes();
            cipherText = SM2Utils.encrypt(Util.hexToByte(pubKey), sourceData);
        } catch (IOException e) {
        }
        return cipherText;
    }
    /**
     * @param str 解密字符串
     */
    public static String smDecrypt(String str,String priKey) {
        String plainText ="";
        try {
            plainText = new String(SM2Utils.decrypt(Util.hexToByte(priKey), Util.hexToByte(str)));
        } catch (IOException e) {
        }
        return plainText;
    }

}
