//
// Created by #Suyghur, on 2021/06/21.
//

#include <toolkit.h>
#include <aes/aes_utils.h>
#include <comm_map.h>
#include <logger.h>
#include <url_utils.h>
#include <md5/md5.h>
#include "include/request_kit.h"


//std::string RequestKit::EncryptRequest(JNIEnv *env, jobject context, jstring params) {
//    //报文的原文
//    std::string raw = ToolKit::ToJsonString(HandleRequest(env, params));
//    //aes key
//    uint8_t *key = AesUtils::GetKey();
//    std::string p = AesUtils::Encrypt(raw.c_str(), key);
//
//    //rsa加密aes key
//    std::string ts = RsaUtils::EncryptByPublicKey(PUBLIC_KEY, reinterpret_cast<const char *>(key));
//
//    Json::Value root;
//    root["p"] = p;
//    root["ts"] = ts;
//    return ToolKit::ToJsonString(root);
//}

//std::string RequestKit::DecryptResponse(JNIEnv *env, jobject context, jstring data) {
//    //报文原文
//    return HandleResponse(env, data);
//}

Json::Value RequestKit::HandleRequest(JNIEnv *env, jstring params) {
    Json::Value root;
    std::string params_ = ToolKit::JString2String(env, params);
    root = ToolKit::ToJsonObject(params_);
    root["common"] = CommMap::GetInstance()->comm_params;
    return root;
}

//std::string RequestKit::HandleResponse(JNIEnv *env, jstring data) {
//    std::string data_ = ToolKit::JString2String(env, data);
//    LOGD("data : %s", data_.c_str());
//    Json::Value root = ToolKit::ToJsonObject(ToolKit::JString2String(env, data));
//    LOGD("ts : %s", root["ts"].asCString());
//    std::string ts = RsaUtils::DecryptByPublicKey2(env, PUBLIC_KEY, root["ts"].asString());
//    LOGD("ts : %s", ts.c_str());
//    const auto *aes_key = reinterpret_cast<const uint8_t *>(ts.c_str());
//    LOGD("aes key : %s", aes_key);
//    const char *p = root["p"].asCString();
//    return AesUtils::Decrypt(p, aes_key);
//}

std::string RequestKit::EncryptRequest2(JNIEnv *env, jobject context, jstring key, jstring params) {
    //报文的原文
//    std::string raw = ToolKit::ToJsonString(HandleRequest(env, params));
//    //aes key
//    char *raw_key = AesUtils::GetRawKey();
//    std::string raw_key_md5 = md5(raw_key);
//    char *iv_32 = AesUtils::GetIv32(raw_key_md5.c_str());
//    char *key_64 = static_cast<char *>(malloc(65));
//    sprintf(key_64, "%s%s", raw_key_md5.c_str(), iv_32);
//    key_64[65] = '\0';
//    std::string key = md5(key_64);
//    std::string aes_key = key.substr(8, 16);
//    std::string p = AesUtils::Encrypt(raw.c_str(), reinterpret_cast<const uint8_t *>(aes_key.c_str()));
//    Json::Value root;
//    root["p"] = p;
//    root["ts"] = raw_key_md5;
//    free(raw_key);
//    free(iv_32);
//    free(key_64);
//    delete aes_key;
//    free((void *) aes_key);
//    return ToolKit::ToJsonString(root);
    return "";
}

std::string RequestKit::DecryptResponse2(JNIEnv *env, jobject context, jstring key, jstring data) {

    const char *key_ = env->GetStringUTFChars(key, JNI_FALSE);
    const char *data_ = env->GetStringUTFChars(data, JNI_FALSE);

    Json::Value root = ToolKit::ToJsonObject(data_);
    const char *p = root["p"].asCString();
    const char *result = AesUtils::Decrypt(p, reinterpret_cast<const uint8_t *>(key_));

//    std::string key_ = ToolKit::JString2String(env, key);
//    std::string data_ = ToolKit::JString2String(env, data);
//    std::string ts = root["ts"].asString();

//    std::string ts_iv = AesUtils::GetIv32(ts.c_str());

//    char *key_64 = static_cast<char *>(malloc(65));
//    sprintf(key_64, "%s%s", ts.c_str(), ts_iv.c_str());
//    std::string key = md5(key_64);
//    std::string aes_key = key.substr(8, 16);
//    std::string ts = RsaUtils::DecryptByPublicKey2(env, PUBLIC_KEY, root["ts"].asString());

//    LOGD("aes key : %s", aes_key.c_str());
//    const char *p = root["p"].asCString();
//    std::string result = AesUtils::Decrypt(p, reinterpret_cast<const uint8_t *>(aes_key.c_str()));
//    free(key_64);
//    delete p;
    return result;
}




