//
// Created by Allen on 24/08/28.
//

#include "JsiDdn.h"

namespace jsiConversion::ddn {
void jDetectedQuadResultItemToJsObject(Runtime &rt, JNIEnv *env, jobject jItem, Object &jsItem) {
    env->PushLocalFrame(4);
    jclass clsItem = env->FindClass("com/dynamsoft/ddn/DetectedQuadResultItem");
    jmethodID me_getLocation =env->GetMethodID(clsItem, "getLocation", "()Lcom/dynamsoft/core/basic_structures/Quadrilateral;");
    jmethodID me_getConfidenceAsDocumentBoundary =env->GetMethodID(clsItem, "getConfidenceAsDocumentBoundary", "()I");
    jmethodID me_getCrossVerificationStatus = env->GetMethodID(clsItem, "getCrossVerificationStatus", "()I");
    Object jsQuad(rt);
    jsiConversion::core::jQuadToJsObject(rt, env, env->CallObjectMethod(jItem, me_getLocation), jsQuad);
    jsItem.setProperty(rt, "location", jsQuad);
    jsItem.setProperty(rt, "confidenceAsDocumentBoundary", env->CallIntMethod(jItem, me_getConfidenceAsDocumentBoundary));
    jsItem.setProperty(rt, "crossVerificationStatus", env->CallIntMethod(jItem, me_getCrossVerificationStatus));
    env->PopLocalFrame(nullptr);
}
void jDeskewedImageResultItemToJsObject(Runtime &rt, JNIEnv *env, jobject jItem, Object &jsItem) {
    env->PushLocalFrame(4);
    jclass clsItem = env->FindClass("com/dynamsoft/ddn/DeskewedImageResultItem");
    jmethodID me_getSourceDeskewQuad = env->GetMethodID(clsItem, "getSourceDeskewQuad", "()Lcom/dynamsoft/core/basic_structures/Quadrilateral;");
    jmethodID me_getImageData = env->GetMethodID(clsItem, "getImageData", "()Lcom/dynamsoft/core/basic_structures/ImageData;");
    jmethodID me_getCrossVerificationStatus = env->GetMethodID(clsItem, "getCrossVerificationStatus", "()I");
    Object jsQuad(rt);
    jsiConversion::core::jQuadToJsObject(rt, env, env->CallObjectMethod(jItem, me_getSourceDeskewQuad), jsQuad);
    jsItem.setProperty(rt, "sourceDeskewQuad", jsQuad);
    jobject jImageData = env->CallObjectMethod(jItem, me_getImageData);
    ImageDataHostObject imgHostObject;
    jsiConversion::core::getHOFromJImageData(env, jImageData, imgHostObject);
    auto jsImageData = Object::createFromHostObject(rt, std::make_shared<ImageDataHostObject>(imgHostObject));
    jsItem.setProperty(rt, "imageData", std::move(jsImageData));
    jsItem.setProperty(rt, "crossVerificationStatus", env->CallIntMethod(jItem, me_getCrossVerificationStatus));

    jclass clsMatrix = env->FindClass("android/graphics/Matrix");
    jmethodID me_getOriginalToLocalMatrix = env->GetMethodID(clsItem, "getOriginalToLocalMatrix", "()Landroid/graphics/Matrix;");
    jobject jMatrix = env->CallObjectMethod(jItem, me_getOriginalToLocalMatrix);
    if(jMatrix) {
        jmethodID getValues = env->GetMethodID(clsMatrix, "getValues", "([F)V");
        jfloatArray jValues = env->NewFloatArray(9);
        env->CallVoidMethod(jMatrix, getValues, jValues);
        float cValues[9];
        env->GetFloatArrayRegion(jValues, 0, 9, cValues);
        Array jsMatrix(rt, 9);
        for (int i = 0; i < 9; ++i) {
            jsMatrix.setValueAtIndex(rt, i, cValues[i]);
        }
        env->DeleteLocalRef(jValues);
        jsItem.setProperty(rt, "originalToLocalMatrix", jsMatrix);
    }
    env->PopLocalFrame(nullptr);
}

void jEnhancedImageResultItemToJsObject(Runtime &rt, JNIEnv *env, jobject jItem, Object &jsItem) {
    env->PushLocalFrame(4);
    jclass clsItem = env->FindClass("com/dynamsoft/ddn/EnhancedImageResultItem");
    jmethodID me_getImageData = env->GetMethodID(clsItem, "getImageData", "()Lcom/dynamsoft/core/basic_structures/ImageData;");
    jobject jImageData = env->CallObjectMethod(jItem, me_getImageData);
    ImageDataHostObject imgHostObject;
    jsiConversion::core::getHOFromJImageData(env, jImageData, imgHostObject);
    auto jsImageData = Object::createFromHostObject(rt, std::make_shared<ImageDataHostObject>(imgHostObject));
    jsItem.setProperty(rt, "imageData", std::move(jsImageData));

    jclass clsMatrix = env->FindClass("android/graphics/Matrix");
    jmethodID me_getOriginalToLocalMatrix = env->GetMethodID(clsItem, "getOriginalToLocalMatrix", "()Landroid/graphics/Matrix;");
    jobject jMatrix = env->CallObjectMethod(jItem, me_getOriginalToLocalMatrix);
    if(jMatrix) {
        jmethodID getValues = env->GetMethodID(clsMatrix, "getValues", "([F)V");
        jfloatArray jValues = env->NewFloatArray(9);
        env->CallVoidMethod(jMatrix, getValues, jValues);
        float cValues[9];
        env->GetFloatArrayRegion(jValues, 0, 9, cValues);
        Array jsMatrix(rt, 9);
        for (int i = 0; i < 9; ++i) {
            jsMatrix.setValueAtIndex(rt, i, cValues[i]);
        }
        env->DeleteLocalRef(jValues);
        jsItem.setProperty(rt, "originalToLocalMatrix", jsMatrix);
    }

    env->PopLocalFrame(nullptr);
}
}//namespace jsiConversion::ddn
