package com.sptg.permissions.api.thirdauth.officedemo;

import com.sptg.permissions.api.thirdauth.constants.CtwingAuthConstants;
import com.sptg.permissions.api.thirdauth.util.ByteFormat;
import com.sptg.permissions.api.thirdauth.util.HmacSha1Util;
import com.sptg.permissions.api.thirdauth.util.XXTeaUtil;
import lombok.extern.slf4j.Slf4j;

import java.util.HashMap;
import java.util.Map;

/**
 * @author lizhb
 * @date 2022/07/27
 */
@Slf4j
public class CtwingUnifyAccountLoginDemo {

    public static void main(String[] args) {
        try {
            // 注意：运行demo前请将天翼账号开放平台申请获取的应用ID(appId)、应用秘钥(appSecret)填写至Constants类中。
            // 运行前请在Constants类中填写或修改请求所需参数

            // 公共请求参数
            // 开发者在天翼账号开放平台申请获取的应用ID
            String appId = CtwingAuthConstants.APP_ID;
            // 统一为：20100
            String clientType = CtwingAuthConstants.clientType;
            // 统一为：redirect（用于重定向接口的显示说明）
            String format = CtwingAuthConstants.format;
            // 调用的接口版本号：v2.1
            String version = CtwingAuthConstants.version;
            // 加密参数
            String paras = getParas();

            // 签名所需参数map
            Map<String, String> signMap = new HashMap<>();
            signMap.put("appId", appId);
            signMap.put("clientType", clientType);
            signMap.put("format", format);
            signMap.put("version", version);
            signMap.put("paras", paras);

            // 签名
            String sign = getSign(signMap);

            // 拼接wap登录框链接（GET请求）
            String webLoginBxUrl = CtwingAuthConstants.UNIFY_ACCOUNT_LOGIN_URL + "?" + "appId=" + appId + "&clientType=" + clientType
                    + "&format=" + format + "&version=" + version + "&paras=" + paras + "&sign=" + sign;

            log.info("generate loginbox web url unifyAccountLogin success.");
            log.info("unifyAccountLogin url : " + webLoginBxUrl);

            // ps: 将生成的链接wapLoginBxUrl复制到浏览器中访问
            // 链接返回wap登录框界面，登录成功后重定向到指定的URL
            // 如http://returnURL?appId=123&paras=123&sign=123。returnURL按照本接口规范定义的参数处理方式接收和处理。

        } catch (Exception e){
            log.error("unifyAccountLogin demo error:",e);
        }
    }


    /**
     * 生成paras参数方法
     * @return
     */
    private static String getParas() throws Exception {
        // 非公共请求参数
        Map<String, String> businessMap = new HashMap<>();
        // 时间戳
        businessMap.put("timeStamp", String.valueOf(System.currentTimeMillis()));
        // 回调地址
        businessMap.put("returnURL", CtwingAuthConstants.returnURL);
        // 页面Key
        businessMap.put("pageKey", CtwingAuthConstants.pageKey);
        // 登录类型
        businessMap.put("regReturnUrl", CtwingAuthConstants.regReturnUrl);
        // 状态参数
        businessMap.put("state", CtwingAuthConstants.state);

        // 拼接非公共请求参数（无顺序要求）
        StringBuffer sb = new StringBuffer();
        for(Map.Entry<String, String> entry : businessMap.entrySet()) {
            sb.append(entry.getKey()).append("=").append(entry.getValue()).append("&");
        }

        // XXTea加密非公共加密参数
        byte[] encValue = XXTeaUtil.encrypt(sb.toString().getBytes(CtwingAuthConstants.DEFAULT_CHARSET)
                , CtwingAuthConstants.APP_SECRET.getBytes(CtwingAuthConstants.DEFAULT_CHARSET));
        return ByteFormat.bytesToHexString(encValue);
    }

    /**
     * 获取签名参数方法
     * @param signMap
     * @return
     */
    private static String getSign(Map<String, String> signMap) throws Exception {
        // 生成签名加密串（拼接顺序为：appId+clientType+format+version+paras）
        String signValue = signMap.get("appId") + signMap.get("clientType") + signMap.get("format")
                + signMap.get("version") + signMap.get("paras");

        // HMAC-SHA1签名
        byte[] encValue = HmacSha1Util.getHmacSHA1(signValue, CtwingAuthConstants.APP_SECRET);
        return ByteFormat.bytesToHexString(encValue);
    }

}
