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

#include "JsiDlr.h"

namespace jsiConversion::dlr {
void jTextLineResultItemToJsObject(Runtime &rt, JNIEnv *env, jobject jItem, Object &jsItem) {
    env->PushLocalFrame(64);
    jclass clsItem = env->FindClass("com/dynamsoft/dlr/TextLineResultItem");
    jmethodID getLocation = env->GetMethodID(clsItem, "getLocation", "()Lcom/dynamsoft/core/basic_structures/Quadrilateral;");
    Object jsQuad(rt);
    jsiConversion::core::jQuadToJsObject(rt, env, env->CallObjectMethod(jItem, getLocation), jsQuad);
    jsItem.setProperty(rt, "location", jsQuad);

    jmethodID getConfidence = env->GetMethodID(clsItem, "getConfidence", "()I");
    jsItem.setProperty(rt, "confidence", env->CallIntMethod(jItem, getConfidence));

    SET_STRING_PROPERTY_BY_METHOD(clsItem, jItem, jsItem, text, getText)
    SET_STRING_PROPERTY_BY_METHOD(clsItem, jItem, jsItem, rawText, getRawText)
    SET_STRING_PROPERTY_BY_METHOD(clsItem, jItem, jsItem, specificationName, getSpecificationName)

    jmethodID getCharacterResults = env->GetMethodID(clsItem, "getCharacterResults", "()[Lcom/dynamsoft/dlr/CharacterResult;");
    auto jCharacterResults = (jobjectArray) env->CallObjectMethod(jItem, getCharacterResults);
    int count = jCharacterResults ? env->GetArrayLength(jCharacterResults) : 0;
    Array jsCharacterResultArray = Array(rt, count);
    for (int i = 0; i < count; ++i) {
        Object jsCharacterResult(rt);
        auto jCharRes = env->GetObjectArrayElement(jCharacterResults, i);
        jCharacterResultToJsObject(rt, env, jCharRes, jsCharacterResult);
        env->DeleteLocalRef(jCharRes);
        jsCharacterResultArray.setValueAtIndex(rt, i, jsCharacterResult);
    }
    jsItem.setProperty(rt, "characterResults", jsCharacterResultArray);
    env->PopLocalFrame(nullptr);
}
void jCharacterResultToJsObject(Runtime &rt, JNIEnv *env, jobject jCharRes, Object &jsCharRes) {
    env->PushLocalFrame(8);
    jclass clsResult = env->FindClass("com/dynamsoft/dlr/CharacterResult");
    jfieldID characterH = env->GetFieldID(clsResult, "characterH", "C");
    jfieldID characterM = env->GetFieldID(clsResult, "characterM", "C");
    jfieldID characterL = env->GetFieldID(clsResult, "characterL", "C");
    // GetCharField returns a jchar (uint16_t), so convert it to a single-character
    // string directly instead of using std::to_string, which would stringify the numeric code point.
    jsCharRes.setProperty(rt, "characterH", std::string(1, static_cast<char>(env->GetCharField(jCharRes, characterH))));
    jsCharRes.setProperty(rt, "characterM", std::string(1, static_cast<char>(env->GetCharField(jCharRes, characterM))));
    jsCharRes.setProperty(rt, "characterL", std::string(1, static_cast<char>(env->GetCharField(jCharRes, characterL))));

    jfieldID characterHConfidence = env->GetFieldID(clsResult, "characterHConfidence", "I");
    jfieldID characterMConfidence = env->GetFieldID(clsResult, "characterMConfidence", "I");
    jfieldID characterLConfidence = env->GetFieldID(clsResult, "characterLConfidence", "I");
    jsCharRes.setProperty(rt, "characterHConfidence", env->GetIntField(jCharRes, characterHConfidence));
    jsCharRes.setProperty(rt, "characterMConfidence", env->GetIntField(jCharRes, characterMConfidence));
    jsCharRes.setProperty(rt, "characterLConfidence", env->GetIntField(jCharRes, characterLConfidence));

    jmethodID getLocation = env->GetMethodID(clsResult, "getLocation", "()Lcom/dynamsoft/core/basic_structures/Quadrilateral;");
    Object jsQuad(rt);
    jsiConversion::core::jQuadToJsObject(rt, env, env->CallObjectMethod(jCharRes, getLocation), jsQuad);
    jsCharRes.setProperty(rt, "location", jsQuad);
    env->PopLocalFrame(nullptr);
}
}//namespace jsiConversion::dlr
