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

#include "JsiDcp.h"

namespace jsiConversion::dcp {
void jParsedResultItemToJsObject(Runtime &rt, JNIEnv *env, jobject jItem, Object &jsItem) {
    jclass clsItem = env->FindClass("com/dynamsoft/dcp/ParsedResultItem");

    SET_STRING_PROPERTY_BY_METHOD(clsItem, jItem, jsItem, codeType, getCodeType)
    SET_STRING_PROPERTY_BY_METHOD(clsItem, jItem, jsItem, jsonString, getJsonString)

    auto getParsedFields = env->GetMethodID(clsItem, "getParsedFields", "()Ljava/util/HashMap;");
    jobject j_parsedFields = env->CallObjectMethod(jItem, getParsedFields);

    jclass clsHashMap = env->FindClass("java/util/HashMap");
    jmethodID keySet = env->GetMethodID(clsHashMap, "keySet", "()Ljava/util/Set;");

    jclass clsSet = env->FindClass("java/util/Set");
    jmethodID toArray = env->GetMethodID(clsSet, "toArray", "()[Ljava/lang/Object;");

    if (!j_parsedFields) {
        return;
    }
    auto j_keySet = env->CallObjectMethod(j_parsedFields, keySet);
    auto j_keyArray = (jobjectArray) env->CallObjectMethod(j_keySet, toArray);
    int count = env->GetArrayLength(j_keyArray);
    auto getFieldValue = env->GetMethodID(clsItem, "getFieldValue", "(Ljava/lang/String;)Ljava/lang/String;");
    auto getFieldMappingStatus = env->GetMethodID(clsItem, "getFieldMappingStatus", "(Ljava/lang/String;)I");
    auto getFieldValidationStatus = env->GetMethodID(clsItem, "getFieldValidationStatus", "(Ljava/lang/String;)I");

    Object js_parsedFields(rt);
    for (int i = 0; i < count; ++i) {
        Object js_itemFiled(rt);
        auto j_key = (jstring) env->GetObjectArrayElement(j_keyArray, i);
        auto p_key = j_key?env->GetStringUTFChars(j_key, nullptr):"";
        if(std::string(p_key).empty()) {
            continue;
        }
        SET_STRING_PROPERTY_BY_METHOD2(jItem, js_itemFiled, value, getFieldValue, j_key)
        js_itemFiled.setProperty(rt, "mappingStatus", env->CallIntMethod(jItem, getFieldMappingStatus, j_key));
        js_itemFiled.setProperty(rt, "validationStatus", env->CallIntMethod(jItem, getFieldValidationStatus, j_key));
        js_parsedFields.setProperty(rt, p_key, js_itemFiled);
        if(j_key) {
            env->ReleaseStringUTFChars(j_key, p_key);
        }
    }
    jsItem.setProperty(rt, "parsedFields", js_parsedFields);
}
}//namespace jsiConversion::dcp
