package psdi.app.iface.oa;

import cn.hutool.core.util.CharsetUtil;
import cn.hutool.crypto.asymmetric.KeyType;
import cn.hutool.crypto.asymmetric.RSA;
import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import com.softlayer.api.service.metric.tracking.Object;
import psdi.app.iface.comm.UrlConstants;

import java.io.IOException;
import java.util.HashMap;
import java.util.Map;
import java.util.UUID;

/**
 * Eam调用OA推送工厂需求申请给OA创建流程工具类
 * edit 2023-05-08
 */
public class EamToOaWorkflowUtils {

    //测试环境 注册appid url
//    public static String app_url="http://oatest2.sunda.com:9002/api/ec/dev/auth/regist";
//    //生产环境  注册appid url http://oa.sunda.com:90/api/ec/dev/auth/regist
////    public static String app_url="";

    //测试环境 获取token url
//    public static String token_url="http://oatest2.sunda.com:9002/api/ec/dev/auth/applytoken";
//    //生产环境 获取token url
////    public static String token_url="";


//    //步骤一 注册appid
//    //1.生产环境与测试环境的appid都是一个固定值 b9d69c35-945c-cbef-dc71-e69fe02e8f90
    public static String appid="b9d69c35-945c-cbef-dc71-e69fe02e8f90";//固定值
    //2.注册返回的测试环境 spk
    public static String spk="MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAqoKZrhqCIpbn3WkUM8OtYQw6D1X8V5OjtdTmFEXeOL5iWL+ssPOPcv+4EVyOYMVzNuvKzbdu0TEmLEnkNq4CFQaAteYAIcGX2SXpJGwpQJEeE6SVyNVcirlaprkXPN4iGZ027EFnjG7SH6aiwb24euypqBqaewr7u1O0dWLQMyKTCbrCIxKwYg+8yEC40IXjdVeQofipU8RilOugki5V2JJIvkNaa+bjprvL+lPVN5po7CJ/Vujy+vpFm7+3ha28BhjxGtqQnjFjdB9TlNmiRamBN70QR/1fOa6w6b8SmGKpjWX3lDUmX0NCSvCnbHRXyLVe8Cn1SIK6waGpitdAywIDAQAB";
    //2. 生产环境的spk 待定？
//    public static String spk=

    //3.注册返回的测试环境 secret
    public static String secret="0073a4a9-5d73-46ca-805e-6b634c221cc3";
    //3.生产环境的 secret 待定？
//    public static String secret="";


    public static void main(String[] args) throws Exception {
//        String data = getRegist();
//        System.out.println("data: "+data);
        String token = getToken("TILE");
        System.out.println("token: "+token);
        String userid=getUserid("0113290");
        System.out.println("userid: "+userid);

//        Map<String, String> heads = new HashMap<String, String>();
//        RSA rsa = new RSA();
//        String publicKey = rsa.getPublicKeyBase64();
//        heads.put("appid", "EEAA5436-7577-4BE0-8C6C-89E9D88805EA");
//        heads.put("cpk", publicKey);
//        String data = OAHttpClient.httpPostForm("http://221.226.25.34:8991/api/ec/dev/auth/regist", null, heads,"utf-8");
//        System.out.println("data: "+data);
    }

    //步骤二 加密userid

    /**
     * 对userid进行加密，由于spk是固定值，所以当前方法执行一次获取加密后的userid即可
     * @return
     *  测试环境加密后的userid: qXttfE9ZoYjQ4wFLrnBYzHwNYB9cuQ7f+dPRksq5OFLoLj1HizHSlScc7arTxgpyt2jaNe7zpsR8FYQRGTplW0mBOpRjDi80h2qu3HQkITiPSDJ1ndRGt+LU32yrHRXLDaxNEEsBzFvieGVEGSooMWb1zMslq7bm3yOwci2w22eFBc0M0bX+13Eqel8/cTxJPVA8hUhZmFHQEUSIaAO6mw0XsTHWbDc1K6lQzqkkTZJ4eIWZ8qCXkY6Yx7Epx0OVf9LNzo6pbsWBC4hwqIJuSDwDd40qnfZAULUAr3H6PI2D7MhYC7MtNwn8rIhw4g79o/HD/9L4vp9lvRxAzURuaQ==
     *  生产环境加密后的userid: 待定?
     * @throws Exception
     */
    public static String getUserid(String id) throws Exception {
//        String userid=encryptUserid(id,spk);
        RSA rsa = new RSA(null, UrlConstants.spk);
        String encryptUserid = rsa.encryptBase64(id, CharsetUtil.CHARSET_UTF_8,KeyType.PublicKey);
        return encryptUserid;
    }


    //步骤三 获取token

    /**
     * 获取 token
     * @return token
     */
    public static String getToken(String orgid) throws IOException {
        JSONObject result = applytoken(UrlConstants.appid, UrlConstants.secret, UrlConstants.spk,orgid);
        JSONObject RESPONSE = (JSONObject) result.get("RESPONSE");
        if(null!=RESPONSE){
            JSONObject RETURN_DATA = (JSONObject) RESPONSE.get("RETURN_DATA");
            if(null!=RETURN_DATA){
                String code=  RETURN_DATA.getString("code");
                if("0".equalsIgnoreCase(code)){
                    String token = RETURN_DATA.getString("token");
                    return token;
                }
            }
        }
        return null;
    }


    /**
     * 获取token 每次调用接口时都需要获取token
     */
    public static JSONObject applytoken(String appid,String secret,String spk,String orgid) throws IOException {
        Map<String, String> heads = new HashMap<String, String>();
        RSA rsa = new RSA(null,spk);
        String encryptSecret = rsa.encryptBase64(secret, CharsetUtil.CHARSET_UTF_8,KeyType.PublicKey);
        heads.put("appid", appid);
        heads.put("secret", encryptSecret);
        heads.put("time", "");
        JSONObject alldata = formatDataToken(heads,orgid);
        JSONObject result = HttpUtilOa.post(UrlConstants.restEsbUrl, alldata);
        return result;
    }

    /**
     * 注册appid 注册一次即可
     * @return
     * // 测试环境返回结果 {"msg":"ok","code":0,"msgShowType":"none","secrit":"3877741f-4ec0-4d41-8c41-38efc5a2f01d","secret":"3877741f-4ec0-4d41-8c41-38efc5a2f01d","status":true,"spk":"MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAwx1tDq4It97vDx2gM8PR3CAoD3TBMOntmvhkuF6AqYCoJDMd7IqKol966gHNo9dZwFVzas7QBugyr89Bhda77qJGFKUSRk5l4KTapOlbdIZM5fW24iVzULCX7C6Y/xo70NNcUwVnrXGj6CKsUCfsYWVSc1nNiuSLrPt0kNm/iEj6jb6i4CzhcewI630mmUFCHNViGrcG/uigGX9rrI8la2zP7soyMFHgMnduawyjQNU3/uz/UGWs/OpyuDZQTyS9iD6ayOTFR6D0yOCq7Sg/ZVlFsWqaVcVS3vGJ5kCHfW7ntka3ObrfeA88YytPUcp+sr8C/58g+4apYOcvfid68wIDAQAB"}
     * // 生产环境返回结果：
     */
    public static String getRegist() throws IOException {
        Map<String, String> heads = new HashMap<String, String>();
        RSA rsa = new RSA();
        String publicKey = rsa.getPublicKeyBase64();

        //appid 固定值为 b9d69c35-945c-cbef-dc71-e69fe02e8f90
        heads.put("appid", UrlConstants.appid);
        //cpk为公钥
        heads.put("cpk", publicKey);
        JSONObject allData=formatDatagetRegist(heads,"TILE");
        JSONObject result2 = HttpUtilOa.post(UrlConstants.restEsbUrl, allData);
        return result2.toString();
    }

    /**
     * 发送REST请求到ESB，先进行数据格式化 获取OA token
     * @param headMap
     * @return
     */
    public static JSONObject formatDataToken(Map<String, String> headMap,String orgid) {
        JSONObject ALLDATA = new JSONObject();
        JSONObject REQUEST = new JSONObject();
        JSONObject ESB_ATTRS = new JSONObject();//ESB报文
        JSONObject REQUEST_DATA = new JSONObject();
        JSONObject Main_DATA = new JSONObject();//主表数据
        JSONArray LINE_DATA = new JSONArray();//子表数据
        JSONObject HEAD = new JSONObject();//包含主、子表数据
        JSONObject workcode = new JSONObject();//包含主、子表数据
        //esb接口平台报文
        ESB_ATTRS.put("App_ID", "POS-TEST"); //源系统
        if("FMCG".equalsIgnoreCase(orgid)){
            ESB_ATTRS.put("Target_ID", "OA-IPO"); //目标系统
        }else{
            ESB_ATTRS.put("Target_ID", "OA"); //目标系统
        }
        ESB_ATTRS.put("Application_ID", "00020000000002"); //固定值
        ESB_ATTRS.put("Transaction_ID", UUID.randomUUID().toString()); //交易id随机生成
        LINE_DATA.add(Main_DATA);
        HEAD.put("appid",headMap.get("appid"));
        HEAD.put("secret",headMap.get("secret"));
        HEAD.put("time",headMap.get("time"));
        REQUEST_DATA.put("SendHead",HEAD);
        REQUEST_DATA.put("SendData",new Object());
        REQUEST_DATA.put("SendURL",new Object());
        REQUEST_DATA.put("Operation", "Z_OA_GET_TOKEM");
        REQUEST_DATA.put("Type", "Z_OA_GET_TOKEM");
        REQUEST.put("ESB_ATTRS", ESB_ATTRS);
        REQUEST.put("REQUEST_DATA", REQUEST_DATA);
        ALLDATA.put("REQUEST", REQUEST);
        return ALLDATA;
    }



    /**
     * 发送REST请求到ESB，先进行数据格式化 注册OA APPID
     * @param headMap
     * @return
     */
    public static JSONObject formatDatagetRegist(Map<String, String> headMap,String orgid) {
        JSONObject ALLDATA = new JSONObject();
        JSONObject REQUEST = new JSONObject();
        JSONObject ESB_ATTRS = new JSONObject();//ESB报文
        JSONObject REQUEST_DATA = new JSONObject();
        JSONObject Main_DATA = new JSONObject();//主表数据
        JSONArray LINE_DATA = new JSONArray();//子表数据
        JSONObject HEAD = new JSONObject();//包含主、子表数据
        JSONObject workcode = new JSONObject();//包含主、子表数据
        //esb接口平台报文
        ESB_ATTRS.put("App_ID", "EAM"); //源系统
        if("FMCG".equalsIgnoreCase(orgid)){
            ESB_ATTRS.put("Target_ID", "OA-IPO"); //目标系统
        }else{
            ESB_ATTRS.put("Target_ID", "OA"); //目标系统
        }
        ESB_ATTRS.put("Application_ID", "00020000000002"); //固定值
        ESB_ATTRS.put("Transaction_ID", UUID.randomUUID().toString()); //交易id随机生成
        LINE_DATA.add(Main_DATA);
        HEAD.put("appid",headMap.get("appid"));
        HEAD.put("cpk",headMap.get("cpk"));
        REQUEST_DATA.put("SendHead",HEAD);
        REQUEST_DATA.put("SendData",new Object());
        REQUEST_DATA.put("SendURL",new Object());
        REQUEST_DATA.put("Operation", "Z_OA_APP_REGIST");
        REQUEST_DATA.put("Type", "Z_OA_APP_REGIST");
        REQUEST.put("ESB_ATTRS", ESB_ATTRS);
        REQUEST.put("REQUEST_DATA", REQUEST_DATA);
        ALLDATA.put("REQUEST", REQUEST);
        return ALLDATA;
    }

}
