package com.easyproject.common.utils;

import cn.hutool.core.util.ObjectUtil;
import com.easyproject.common.constant.HttpStatus;
import com.easyproject.common.constant.SignConstants;
import com.easyproject.common.exception.ServiceException;
import lombok.extern.slf4j.Slf4j;
import org.springframework.util.DigestUtils;
import org.springframework.util.StringUtils;

import java.util.Map;
import java.util.SortedMap;

/**
 * 签名工具类
 *
 * @author xunjian
 * @date 20210621
 */
@Slf4j
public class SignUtil {

    /**
     * @param params
     *            所有的请求参数都会在这里进行排序加密
     * @return 验证签名结果
     */
    public static boolean verifySign(SortedMap<String, String> params,String headerSign,String signatureSecret) {
        if (params == null || StringUtils.isEmpty(headerSign)) {
            return false;
        }
        // 把参数加密
        String paramsSign = getParamsSign(params,signatureSecret);
        log.info("服务端参数签名后 : {}", paramsSign);
        return !StringUtils.isEmpty(paramsSign) && headerSign.equals(paramsSign);
    }

    /**
     * @param params
     *            所有的请求参数都会在这里进行排序加密
     * @return 得到签名
     */
    public static String getParamsSign(SortedMap<String, String> params,String signatureSecret) {
        //获得排序后的参数值
        StringBuilder paramsValueStr = new StringBuilder();
        for (Map.Entry<String, String> entry : params.entrySet()) {
            paramsValueStr.append(entry.getValue());
        }

        log.info("待签名字符串 ===> {}", paramsValueStr+signatureSecret);
        //设置签名秘钥
        String curlyBracket = SignConstants.DOLLAR + SignConstants.LEFT_CURLY_BRACKET;
        if(ObjectUtil.isEmpty(signatureSecret) || signatureSecret.contains(curlyBracket)){
            throw new ServiceException("签名密钥配置错误", HttpStatus.UNAUTHORIZED);
        }
        return DigestUtils.md5DigestAsHex((paramsValueStr + signatureSecret).getBytes()).toUpperCase();
    }
}
