//
// Created by CORP\jingi.jung on 19. 5. 14.
//

#include <jni.h>
#include <string.h>
#include "COMMON/bc_core/public/coldwallet_api.h"
#include "COMMON/bc_core/public/msgs/coldwallet_msg.h"
#include "COMMON/bc_core/shared/process_cmd.h"
#include "COMMON/bc_core/public/coldwallet_errors.h"
#include "COMMON/bc_core/shared/coldwallet_crypto_tl.h"
#include "NDK/tz_platform/vendor/Ndk/core/tl/VS_TZ_debug.h"
#include "COMMON/tz_spay_common/public/spay_load_pin_random_msg.h"
#include <android/log.h>
#include "COMMON/tz_spay_common/public/spay_pin_random_util_tl.h"

void init() {
//    uint8_t rand_value[SPAY_RANDOM_NUMBER_SIZE] = { 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F, 0x10, 0x11, 0x12, 0x13, 0x14 };
//    set_pin_random(rand_value, SPAY_RANDOM_NUMBER_SIZE);
}


JNIEXPORT jint JNICALL JNI_OnLoad(JavaVM* vm, void* reserved) {
    JNIEnv* env;
    if ((*vm)->GetEnv(vm, (void**)&env, JNI_VERSION_1_6) != JNI_OK) {
        return JNI_ERR; // JNI version not supported.
    }
    TTY_LOG("bc-core-so loaded");
    init();
    return JNI_VERSION_1_6;
}

JNIEXPORT jobject JNICALL
Java_com_samsung_android_blockchainnativelibs_BcTaNativeHandler_processCommand(JNIEnv *env, jclass type, jint cmdId, jbyteArray payload_, jint payloadLength) {

    jbyte *payload = (*env)->GetByteArrayElements(env, payload_, NULL);

    tciMessage_t sendTciMessage;
    tciMessage_t respTciMessage;

    memset(&sendTciMessage, 0x00, sizeof(sendTciMessage));
    memset(&respTciMessage, 0x00, sizeof(respTciMessage));

    TTY_LOG("CMD[%d] - payload length : %d",cmdId, payloadLength);
    TTY_LOG("Sizeof TciMessage : %ld", sizeof(sendTciMessage));

    if(sizeof(sendTciMessage) < payloadLength) {
        TTY_ERROR_LOG("payload length is larger than tciMessage %ld - %ld", sizeof(sendTciMessage), payloadLength);
    }

    memcpy(&sendTciMessage.payload, payload, (size_t)payloadLength);
    int32_t result = process_cmd((uint32_t )cmdId, &sendTciMessage, sizeof(sendTciMessage)
            , &respTciMessage, sizeof(respTciMessage));

    jbyteArray retVal = (*env)->NewByteArray(env, sizeof(respTciMessage.payload));
    (*env)->SetByteArrayRegion(env, retVal, 0, sizeof(respTciMessage.payload),
                               (const jbyte *) &respTciMessage.payload);

    jclass class = (*env)->FindClass(env,"com/samsung/android/blockchainnativelibs/response/TANativeResponse");

    jmethodID cid = (*env)->GetMethodID(env,class, "<init>", "()V");
    jobject newObject = (*env)->NewObject(env, class, cid, "()V");

    jfieldID fid = (*env)->GetFieldID(env, class, "result", "I");
    (*env)->SetIntField(env, newObject, fid, result);

    fid = (*env)->GetFieldID(env, class, "errorMessage", "Ljava/lang/String;");
    jstring errorMessage = (*env)->NewStringUTF(env, "");
    (*env)->SetObjectField(env, newObject, fid, errorMessage);

    fid = (*env)->GetFieldID(env, class, "payload", "[B");
    (*env)->SetObjectField(env, newObject, fid, retVal);

    (*env)->DeleteLocalRef(env, retVal);

    return newObject;
}
