/*
 * Copyright (C) 2022 Huawei Device Co., Ltd.
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *     http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

#include <cstdio>
#include <cstring>
#include <pthread.h>
#include <unistd.h>

#include "hilog_wrapper.h"
#include "napi_accessibility_config.h"
#include "napi/native_api.h"
#include "napi/native_node_api.h"
#include "accessibility_config.h"

EXTERN_C_START
/*
 * function for module exports
 */
static napi_property_descriptor configDesc[] = {
    DECLARE_NAPI_FUNCTION("set", NAccessibilityConfig::SetConfig),
    DECLARE_NAPI_FUNCTION("get", NAccessibilityConfig::GetConfig),
    DECLARE_NAPI_FUNCTION("on", NAccessibilityConfig::SubscribeConfigObserver),
    DECLARE_NAPI_FUNCTION("off", NAccessibilityConfig::UnSubscribeConfigObserver),
};

static napi_value InitHighContrastText(napi_env env)
{
    napi_value highContrastTextValue = nullptr;
    napi_create_object(env, &highContrastTextValue);
    if (highContrastTextValue == nullptr) {
        HILOG_ERROR("napi_create_object fail.");
        return highContrastTextValue;
    }
    NAPI_CALL(env, napi_define_properties(env, highContrastTextValue,
                                          sizeof(configDesc) / sizeof(configDesc[0]),
                                          configDesc));
    NAccessibilityConfigClass* nativeObj =
        new(std::nothrow) NAccessibilityConfigClass(OHOS::AccessibilityConfig::CONFIG_HIGH_CONTRAST_TEXT);
    if (nativeObj == nullptr) {
        HILOG_ERROR("Failed to create nativeObj.");
        return nullptr;
    }
    nativeObj->SetEnv(env);
    napi_status sts = napi_wrap(env, highContrastTextValue, reinterpret_cast<void*>(nativeObj),
        NAccessibilityConfigClass::Destructor, nullptr, nullptr);
    if (sts != napi_ok) {
        delete nativeObj;
        nativeObj = nullptr;
        HILOG_ERROR("failed to wrap JS object");
        return nullptr;
    }
    return highContrastTextValue;
}

static napi_value InitInvertColor(napi_env env)
{
    napi_value invertColorValue = nullptr;
    napi_create_object(env, &invertColorValue);
    if (invertColorValue == nullptr) {
        HILOG_ERROR("napi_create_object fail.");
        return invertColorValue;
    }
    NAPI_CALL(env, napi_define_properties(env, invertColorValue,
                                          sizeof(configDesc) / sizeof(configDesc[0]),
                                          configDesc));
    NAccessibilityConfigClass* nativeObj =
        new(std::nothrow) NAccessibilityConfigClass(OHOS::AccessibilityConfig::CONFIG_INVERT_COLOR);
    if (nativeObj == nullptr) {
        HILOG_ERROR("Failed to create nativeObj.");
        return nullptr;
    }
    nativeObj->SetEnv(env);
    napi_status sts = napi_wrap(env, invertColorValue, reinterpret_cast<void*>(nativeObj),
        NAccessibilityConfigClass::Destructor, nullptr, nullptr);
    if (sts != napi_ok) {
        delete nativeObj;
        nativeObj = nullptr;
        HILOG_ERROR("failed to wrap JS object");
        return nullptr;
    }
    return invertColorValue;
}

static napi_value InitDaltonizationState(napi_env env)
{
    napi_value daltonizationStateValue = nullptr;
    napi_create_object(env, &daltonizationStateValue);
    if (daltonizationStateValue == nullptr) {
        HILOG_ERROR("napi_create_object fail.");
        return daltonizationStateValue;
    }
    NAPI_CALL(env, napi_define_properties(env, daltonizationStateValue,
                                          sizeof(configDesc) / sizeof(configDesc[0]),
                                          configDesc));
    NAccessibilityConfigClass* nativeObj =
        new(std::nothrow) NAccessibilityConfigClass(OHOS::AccessibilityConfig::CONFIG_DALTONIZATION_STATE);
    if (nativeObj == nullptr) {
        HILOG_ERROR("Failed to create nativeObj.");
        return nullptr;
    }
    nativeObj->SetEnv(env);
    napi_status sts = napi_wrap(env, daltonizationStateValue, reinterpret_cast<void*>(nativeObj),
        NAccessibilityConfigClass::Destructor, nullptr, nullptr);
    if (sts != napi_ok) {
        delete nativeObj;
        nativeObj = nullptr;
        HILOG_ERROR("failed to wrap JS object");
        return nullptr;
    }
    return daltonizationStateValue;
}

static napi_value InitDaltonizationColorFilter(napi_env env)
{
    napi_value daltonizationColorFilterValue = nullptr;
    napi_create_object(env, &daltonizationColorFilterValue);
    if (daltonizationColorFilterValue == nullptr) {
        HILOG_ERROR("napi_create_object fail.");
        return daltonizationColorFilterValue;
    }
    NAPI_CALL(env, napi_define_properties(env, daltonizationColorFilterValue,
                                          sizeof(configDesc) /
                                          sizeof(configDesc[0]),
                                          configDesc));
    NAccessibilityConfigClass* nativeObj =
        new(std::nothrow) NAccessibilityConfigClass(OHOS::AccessibilityConfig::CONFIG_DALTONIZATION_COLOR_FILTER);
    if (nativeObj == nullptr) {
        HILOG_ERROR("Failed to create nativeObj.");
        return nullptr;
    }
    nativeObj->SetEnv(env);
    napi_status sts = napi_wrap(env, daltonizationColorFilterValue, reinterpret_cast<void*>(nativeObj),
        NAccessibilityConfigClass::Destructor, nullptr, nullptr);
    if (sts != napi_ok) {
        delete nativeObj;
        nativeObj = nullptr;
        HILOG_ERROR("failed to wrap JS object");
        return nullptr;
    }
    return daltonizationColorFilterValue;
}

static napi_value InitContentTimeout(napi_env env)
{
    napi_value contentTimeoutValue = nullptr;
    napi_create_object(env, &contentTimeoutValue);
    if (contentTimeoutValue == nullptr) {
        HILOG_ERROR("napi_create_object fail.");
        return contentTimeoutValue;
    }
    NAPI_CALL(env, napi_define_properties(env, contentTimeoutValue,
                                          sizeof(configDesc) / sizeof(configDesc[0]),
                                          configDesc));
    NAccessibilityConfigClass* nativeObj =
        new(std::nothrow) NAccessibilityConfigClass(OHOS::AccessibilityConfig::CONFIG_CONTENT_TIMEOUT);
    if (nativeObj == nullptr) {
        HILOG_ERROR("Failed to create nativeObj.");
        return nullptr;
    }
    nativeObj->SetEnv(env);
    napi_status sts = napi_wrap(env, contentTimeoutValue, reinterpret_cast<void*>(nativeObj),
        NAccessibilityConfigClass::Destructor, nullptr, nullptr);
    if (sts != napi_ok) {
        delete nativeObj;
        nativeObj = nullptr;
        HILOG_ERROR("failed to wrap JS object");
        return nullptr;
    }
    return contentTimeoutValue;
}

static napi_value InitAnimationOff(napi_env env)
{
    napi_value animationOffValue = nullptr;
    napi_create_object(env, &animationOffValue);
    if (animationOffValue == nullptr) {
        HILOG_ERROR("napi_create_object fail.");
        return animationOffValue;
    }
    NAPI_CALL(env, napi_define_properties(env, animationOffValue,
                                          sizeof(configDesc) / sizeof(configDesc[0]),
                                          configDesc));
    NAccessibilityConfigClass* nativeObj =
        new(std::nothrow) NAccessibilityConfigClass(OHOS::AccessibilityConfig::CONFIG_ANIMATION_OFF);
    if (nativeObj == nullptr) {
        HILOG_ERROR("Failed to create nativeObj.");
        return nullptr;
    }
    nativeObj->SetEnv(env);
    napi_status sts = napi_wrap(env, animationOffValue, reinterpret_cast<void*>(nativeObj),
        NAccessibilityConfigClass::Destructor, nullptr, nullptr);
    if (sts != napi_ok) {
        delete nativeObj;
        nativeObj = nullptr;
        HILOG_ERROR("failed to wrap JS object");
        return nullptr;
    }
    return animationOffValue;
}

static napi_value InitBrightnessDiscount(napi_env env)
{
    napi_value brightnessDiscountValue = nullptr;
    napi_create_object(env, &brightnessDiscountValue);
    if (brightnessDiscountValue == nullptr) {
        HILOG_ERROR("napi_create_object fail.");
        return brightnessDiscountValue;
    }
    NAPI_CALL(env, napi_define_properties(env, brightnessDiscountValue,
                                          sizeof(configDesc) / sizeof(configDesc[0]),
                                          configDesc));
    NAccessibilityConfigClass* nativeObj =
        new(std::nothrow) NAccessibilityConfigClass(OHOS::AccessibilityConfig::CONFIG_BRIGHTNESS_DISCOUNT);
    if (nativeObj == nullptr) {
        HILOG_ERROR("Failed to create nativeObj.");
        return nullptr;
    }
    nativeObj->SetEnv(env);
    napi_status sts = napi_wrap(env, brightnessDiscountValue, reinterpret_cast<void*>(nativeObj),
        NAccessibilityConfigClass::Destructor, nullptr, nullptr);
    if (sts != napi_ok) {
        delete nativeObj;
        nativeObj = nullptr;
        HILOG_ERROR("failed to wrap JS object");
        return nullptr;
    }
    return brightnessDiscountValue;
}

static napi_value InitScreenMagnifier(napi_env env)
{
    napi_value screenMagnifierValue = nullptr;
    napi_create_object(env, &screenMagnifierValue);
    if (screenMagnifierValue == nullptr) {
        HILOG_ERROR("napi_create_object fail.");
        return screenMagnifierValue;
    }
    NAPI_CALL(env, napi_define_properties(env, screenMagnifierValue,
                                          sizeof(configDesc) / sizeof(configDesc[0]),
                                          configDesc));
    NAccessibilityConfigClass* nativeObj =
        new(std::nothrow) NAccessibilityConfigClass(OHOS::AccessibilityConfig::CONFIG_SCREEN_MAGNIFICATION);
    if (nativeObj == nullptr) {
        HILOG_ERROR("Failed to create nativeObj.");
        return nullptr;
    }
    nativeObj->SetEnv(env);
    napi_status sts = napi_wrap(env, screenMagnifierValue, reinterpret_cast<void*>(nativeObj),
        NAccessibilityConfigClass::Destructor, nullptr, nullptr);
    if (sts != napi_ok) {
        delete nativeObj;
        nativeObj = nullptr;
        HILOG_ERROR("failed to wrap JS object");
        return nullptr;
    }
    return screenMagnifierValue;
}

static napi_value InitAudioMono(napi_env env)
{
    napi_value audioMonoValue = nullptr;
    napi_create_object(env, &audioMonoValue);
    if (audioMonoValue == nullptr) {
        HILOG_ERROR("napi_create_object fail.");
        return audioMonoValue;
    }
    NAPI_CALL(env, napi_define_properties(env, audioMonoValue,
                                          sizeof(configDesc) / sizeof(configDesc[0]),
                                          configDesc));
    NAccessibilityConfigClass* nativeObj =
        new(std::nothrow) NAccessibilityConfigClass(OHOS::AccessibilityConfig::CONFIG_AUDIO_MONO);
    if (nativeObj == nullptr) {
        HILOG_ERROR("Failed to create nativeObj.");
        return nullptr;
    }
    nativeObj->SetEnv(env);
    napi_status sts = napi_wrap(env, audioMonoValue, reinterpret_cast<void*>(nativeObj),
        NAccessibilityConfigClass::Destructor, nullptr, nullptr);
    if (sts != napi_ok) {
        delete nativeObj;
        nativeObj = nullptr;
        HILOG_ERROR("failed to wrap JS object");
        return nullptr;
    }
    return audioMonoValue;
}

static napi_value InitAudioBalance(napi_env env)
{
    napi_value audioBalanceValue = nullptr;
    napi_create_object(env, &audioBalanceValue);
    if (audioBalanceValue == nullptr) {
        HILOG_ERROR("napi_create_object fail.");
        return audioBalanceValue;
    }
    NAPI_CALL(env, napi_define_properties(env, audioBalanceValue,
                                          sizeof(configDesc) / sizeof(configDesc[0]),
                                          configDesc));
    NAccessibilityConfigClass* nativeObj =
        new(std::nothrow) NAccessibilityConfigClass(OHOS::AccessibilityConfig::CONFIG_AUDIO_BALANCE);
    if (nativeObj == nullptr) {
        HILOG_ERROR("Failed to create nativeObj.");
        return nullptr;
    }
    nativeObj->SetEnv(env);
    napi_status sts = napi_wrap(env, audioBalanceValue, reinterpret_cast<void*>(nativeObj),
        NAccessibilityConfigClass::Destructor, nullptr, nullptr);
    if (sts != napi_ok) {
        delete nativeObj;
        nativeObj = nullptr;
        HILOG_ERROR("failed to wrap JS object");
        return nullptr;
    }
    return audioBalanceValue;
}

static napi_value InitMouseKey(napi_env env)
{
    napi_value mouseKeyValue = nullptr;
    napi_create_object(env, &mouseKeyValue);
    if (mouseKeyValue == nullptr) {
        HILOG_ERROR("napi_create_object fail.");
        return mouseKeyValue;
    }
    NAPI_CALL(env, napi_define_properties(env, mouseKeyValue,
                                          sizeof(configDesc) / sizeof(configDesc[0]),
                                          configDesc));
    NAccessibilityConfigClass* nativeObj =
        new(std::nothrow) NAccessibilityConfigClass(OHOS::AccessibilityConfig::CONFIG_MOUSE_KEY);
    if (nativeObj == nullptr) {
        HILOG_ERROR("Failed to create nativeObj.");
        return nullptr;
    }
    nativeObj->SetEnv(env);
    napi_status sts = napi_wrap(env, mouseKeyValue, reinterpret_cast<void*>(nativeObj),
        NAccessibilityConfigClass::Destructor, nullptr, nullptr);
    if (sts != napi_ok) {
        delete nativeObj;
        nativeObj = nullptr;
        HILOG_ERROR("failed to wrap JS object");
        return nullptr;
    }
    return mouseKeyValue;
}

static napi_value InitMouseAutoClick(napi_env env)
{
    napi_value mouseAutoClickValue = nullptr;
    napi_create_object(env, &mouseAutoClickValue);
    if (mouseAutoClickValue == nullptr) {
        HILOG_ERROR("napi_create_object fail.");
        return mouseAutoClickValue;
    }
    NAPI_CALL(env, napi_define_properties(env, mouseAutoClickValue,
                                          sizeof(configDesc) / sizeof(configDesc[0]),
                                          configDesc));
    NAccessibilityConfigClass* nativeObj =
        new(std::nothrow) NAccessibilityConfigClass(OHOS::AccessibilityConfig::CONFIG_MOUSE_AUTOCLICK);
    if (nativeObj == nullptr) {
        HILOG_ERROR("Failed to create nativeObj.");
        return nullptr;
    }
    nativeObj->SetEnv(env);
    napi_status sts = napi_wrap(env, mouseAutoClickValue, reinterpret_cast<void*>(nativeObj),
        NAccessibilityConfigClass::Destructor, nullptr, nullptr);
    if (sts != napi_ok) {
        delete nativeObj;
        nativeObj = nullptr;
        HILOG_ERROR("failed to wrap JS object");
        return nullptr;
    }
    return mouseAutoClickValue;
}

static napi_value InitShortKey(napi_env env)
{
    napi_value shortKeyValue = nullptr;
    napi_create_object(env, &shortKeyValue);
    if (shortKeyValue == nullptr) {
        HILOG_ERROR("napi_create_object fail.");
        return shortKeyValue;
    }
    NAPI_CALL(env, napi_define_properties(env, shortKeyValue,
                                          sizeof(configDesc) / sizeof(configDesc[0]),
                                          configDesc));
    NAccessibilityConfigClass* nativeObj =
        new(std::nothrow) NAccessibilityConfigClass(OHOS::AccessibilityConfig::CONFIG_SHORT_KEY);
    if (nativeObj == nullptr) {
        HILOG_ERROR("Failed to create nativeObj.");
        return nullptr;
    }
    nativeObj->SetEnv(env);
    napi_status sts = napi_wrap(env, shortKeyValue, reinterpret_cast<void*>(nativeObj),
        NAccessibilityConfigClass::Destructor, nullptr, nullptr);
    if (sts != napi_ok) {
        delete nativeObj;
        nativeObj = nullptr;
        HILOG_ERROR("failed to wrap JS object");
        return nullptr;
    }
    return shortKeyValue;
}

static napi_value InitShortKeyTarget(napi_env env)
{
    napi_value shortKeyTargetValue = nullptr;
    napi_create_object(env, &shortKeyTargetValue);
    if (shortKeyTargetValue == nullptr) {
        HILOG_ERROR("napi_create_object fail.");
        return shortKeyTargetValue;
    }
    NAPI_CALL(env, napi_define_properties(env, shortKeyTargetValue,
                                          sizeof(configDesc) / sizeof(configDesc[0]),
                                          configDesc));
    NAccessibilityConfigClass* nativeObj =
        new(std::nothrow) NAccessibilityConfigClass(OHOS::AccessibilityConfig::CONFIG_SHORT_KEY_TARGET);
    if (nativeObj == nullptr) {
        HILOG_ERROR("Failed to create nativeObj.");
        return nullptr;
    }
    nativeObj->SetEnv(env);
    napi_status sts = napi_wrap(env, shortKeyTargetValue, reinterpret_cast<void*>(nativeObj),
        NAccessibilityConfigClass::Destructor, nullptr, nullptr);
    if (sts != napi_ok) {
        delete nativeObj;
        nativeObj = nullptr;
        HILOG_ERROR("failed to wrap JS object");
        return nullptr;
    }
    return shortKeyTargetValue;
}

static napi_value InitShortKeyMultiTarget(napi_env env)
{
    napi_value shortKeyMultiTargetValue = nullptr;
    napi_create_object(env, &shortKeyMultiTargetValue);
    if (shortKeyMultiTargetValue == nullptr) {
        HILOG_ERROR("napi_create_object fail.");
        return shortKeyMultiTargetValue;
    }
    NAPI_CALL(env, napi_define_properties(env, shortKeyMultiTargetValue,
                                          sizeof(configDesc) / sizeof(configDesc[0]),
                                          configDesc));
    NAccessibilityConfigClass* nativeObj =
        new(std::nothrow) NAccessibilityConfigClass(OHOS::AccessibilityConfig::CONFIG_SHORT_KEY_MULTI_TARGET);
    if (nativeObj == nullptr) {
        HILOG_ERROR("Failed to create nativeObj.");
        return nullptr;
    }
    nativeObj->SetEnv(env);
    napi_status sts = napi_wrap(env, shortKeyMultiTargetValue, reinterpret_cast<void*>(nativeObj),
        NAccessibilityConfigClass::Destructor, nullptr, nullptr);
    if (sts != napi_ok) {
        delete nativeObj;
        nativeObj = nullptr;
        HILOG_ERROR("failed to wrap JS object");
        return nullptr;
    }
    return shortKeyMultiTargetValue;
}

static napi_value InitCaptionsState(napi_env env)
{
    napi_value captionsValue = nullptr;
    napi_create_object(env, &captionsValue);
    if (captionsValue == nullptr) {
        HILOG_ERROR("napi_create_object fail.");
        return captionsValue;
    }
    NAPI_CALL(env, napi_define_properties(env, captionsValue,
                                          sizeof(configDesc) / sizeof(configDesc[0]),
                                          configDesc));
    NAccessibilityConfigClass* nativeObj =
        new(std::nothrow) NAccessibilityConfigClass(OHOS::AccessibilityConfig::CONFIG_CAPTION_STATE);
    if (nativeObj == nullptr) {
        HILOG_ERROR("Failed to create nativeObj.");
        return nullptr;
    }
    nativeObj->SetEnv(env);
    napi_status sts = napi_wrap(env, captionsValue, reinterpret_cast<void*>(nativeObj),
        NAccessibilityConfigClass::Destructor, nullptr, nullptr);
    if (sts != napi_ok) {
        delete nativeObj;
        nativeObj = nullptr;
        HILOG_ERROR("failed to wrap JS object");
        return nullptr;
    }
    return captionsValue;
}

static napi_value InitCaptionsStyle(napi_env env)
{
    napi_value captionsStyleValue = nullptr;
    napi_create_object(env, &captionsStyleValue);
    if (captionsStyleValue == nullptr) {
        HILOG_ERROR("napi_create_object fail.");
        return captionsStyleValue;
    }
    NAPI_CALL(env, napi_define_properties(env, captionsStyleValue,
                                          sizeof(configDesc) / sizeof(configDesc[0]),
                                          configDesc));
    NAccessibilityConfigClass* nativeObj =
        new(std::nothrow) NAccessibilityConfigClass(OHOS::AccessibilityConfig::CONFIG_CAPTION_STYLE);
    if (nativeObj == nullptr) {
        HILOG_ERROR("Failed to create nativeObj.");
        return nullptr;
    }
    nativeObj->SetEnv(env);
    napi_status sts = napi_wrap(env, captionsStyleValue, reinterpret_cast<void*>(nativeObj),
        NAccessibilityConfigClass::Destructor, nullptr, nullptr);
    if (sts != napi_ok) {
        delete nativeObj;
        nativeObj = nullptr;
        HILOG_ERROR("failed to wrap JS object");
        return nullptr;
    }
    return captionsStyleValue;
}

static napi_value InitClickResponseTime(napi_env env)
{
    napi_value clickResponseTimeValue = nullptr;
    napi_create_object(env, &clickResponseTimeValue);
    if (clickResponseTimeValue == nullptr) {
        HILOG_ERROR("napi_create_object fail.");
        return clickResponseTimeValue;
    }
    NAPI_CALL(env, napi_define_properties(env, clickResponseTimeValue,
                                          sizeof(configDesc) / sizeof(configDesc[0]),
                                          configDesc));
    NAccessibilityConfigClass* nativeObj =
        new(std::nothrow) NAccessibilityConfigClass(OHOS::AccessibilityConfig::CONIFG_CLICK_RESPONSE_TIME);
    if (nativeObj == nullptr) {
        HILOG_ERROR("Failed to create nativeObj.");
        return nullptr;
    }
    nativeObj->SetEnv(env);
    napi_status sts = napi_wrap(env, clickResponseTimeValue, reinterpret_cast<void*>(nativeObj),
        NAccessibilityConfigClass::Destructor, nullptr, nullptr);
    if (sts != napi_ok) {
        delete nativeObj;
        nativeObj = nullptr;
        HILOG_ERROR("failed to wrap JS object");
        return nullptr;
    }
    return clickResponseTimeValue;
}

static napi_value InitIgnoreRepeatClickState(napi_env env)
{
    napi_value ignoreRepeatClickStateValue = nullptr;
    napi_create_object(env, &ignoreRepeatClickStateValue);
    if (ignoreRepeatClickStateValue == nullptr) {
        HILOG_ERROR("napi_create_object fail.");
        return ignoreRepeatClickStateValue;
    }
    NAPI_CALL(env, napi_define_properties(env, ignoreRepeatClickStateValue,
                                          sizeof(configDesc) / sizeof(configDesc[0]),
                                          configDesc));
    NAccessibilityConfigClass* nativeObj =
        new(std::nothrow) NAccessibilityConfigClass(OHOS::AccessibilityConfig::CONFIG_IGNORE_REPEAT_CLICK_STATE);
    if (nativeObj == nullptr) {
        HILOG_ERROR("Failed to create nativeObj.");
        return nullptr;
    }
    nativeObj->SetEnv(env);
    napi_status sts = napi_wrap(env, ignoreRepeatClickStateValue, reinterpret_cast<void*>(nativeObj),
        NAccessibilityConfigClass::Destructor, nullptr, nullptr);
    if (sts != napi_ok) {
        delete nativeObj;
        nativeObj = nullptr;
        HILOG_ERROR("failed to wrap JS object");
        return nullptr;
    }
    return ignoreRepeatClickStateValue;
}

static napi_value InitIgnoreRepeatClickTime(napi_env env)
{
    napi_value ignoreRepeatClickTimeValue = nullptr;
    napi_create_object(env, &ignoreRepeatClickTimeValue);
    if (ignoreRepeatClickTimeValue == nullptr) {
        HILOG_ERROR("napi_create_object fail.");
        return ignoreRepeatClickTimeValue;
    }
    NAPI_CALL(env, napi_define_properties(env, ignoreRepeatClickTimeValue,
                                          sizeof(configDesc) / sizeof(configDesc[0]),
                                          configDesc));
    NAccessibilityConfigClass* nativeObj =
        new(std::nothrow) NAccessibilityConfigClass(OHOS::AccessibilityConfig::CONFIG_IGNORE_REPEAT_CLICK_TIME);
    if (nativeObj == nullptr) {
        HILOG_ERROR("Failed to create nativeObj.");
        return nullptr;
    }
    nativeObj->SetEnv(env);
    napi_status sts = napi_wrap(env, ignoreRepeatClickTimeValue, reinterpret_cast<void*>(nativeObj),
        NAccessibilityConfigClass::Destructor, nullptr, nullptr);
    if (sts != napi_ok) {
        delete nativeObj;
        nativeObj = nullptr;
        HILOG_ERROR("failed to wrap JS object");
        return nullptr;
    }
    return ignoreRepeatClickTimeValue;
}

static napi_value InitConfigModule(napi_env env, napi_value exports)
{
    napi_property_descriptor desc[] = {
        DECLARE_NAPI_FUNCTION("on", NAccessibilityConfig::SubscribeState),
        DECLARE_NAPI_FUNCTION("off", NAccessibilityConfig::UnsubscribeState),
        DECLARE_NAPI_FUNCTION("enableAbility", NAccessibilityConfig::EnableAbility),
        DECLARE_NAPI_FUNCTION("disableAbility", NAccessibilityConfig::DisableAbility),
        DECLARE_NAPI_STATIC_PROPERTY("highContrastText", InitHighContrastText(env)),
        DECLARE_NAPI_STATIC_PROPERTY("invertColor", InitInvertColor(env)),
        DECLARE_NAPI_STATIC_PROPERTY("daltonizationState", InitDaltonizationState(env)),
        DECLARE_NAPI_STATIC_PROPERTY("daltonizationColorFilter", InitDaltonizationColorFilter(env)),
        DECLARE_NAPI_STATIC_PROPERTY("contentTimeout", InitContentTimeout(env)),
        DECLARE_NAPI_STATIC_PROPERTY("animationOff", InitAnimationOff(env)),
        DECLARE_NAPI_STATIC_PROPERTY("brightnessDiscount", InitBrightnessDiscount(env)),
        DECLARE_NAPI_STATIC_PROPERTY("screenMagnifier", InitScreenMagnifier(env)),
        DECLARE_NAPI_STATIC_PROPERTY("audioMono", InitAudioMono(env)),
        DECLARE_NAPI_STATIC_PROPERTY("audioBalance", InitAudioBalance(env)),
        DECLARE_NAPI_STATIC_PROPERTY("mouseKey", InitMouseKey(env)),
        DECLARE_NAPI_STATIC_PROPERTY("mouseAutoClick", InitMouseAutoClick(env)),
        DECLARE_NAPI_STATIC_PROPERTY("shortkey", InitShortKey(env)),
        DECLARE_NAPI_STATIC_PROPERTY("shortkeyTarget", InitShortKeyTarget(env)),
        DECLARE_NAPI_STATIC_PROPERTY("shortkeyMultiTargets", InitShortKeyMultiTarget(env)),
        DECLARE_NAPI_STATIC_PROPERTY("captions", InitCaptionsState(env)),
        DECLARE_NAPI_STATIC_PROPERTY("captionsStyle", InitCaptionsStyle(env)),
        DECLARE_NAPI_STATIC_PROPERTY("clickResponseTime", InitClickResponseTime(env)),
        DECLARE_NAPI_STATIC_PROPERTY("ignoreRepeatClick", InitIgnoreRepeatClickState(env)),
        DECLARE_NAPI_STATIC_PROPERTY("repeatClickInterval", InitIgnoreRepeatClickTime(env)),
    };

    NAPI_CALL(env, napi_define_properties(env, exports, sizeof(desc) / sizeof(desc[0]), desc));

    auto &instance = OHOS::AccessibilityConfig::AccessibilityConfig::GetInstance();
    (void)instance.InitializeContext();
    NAccessibilityConfig::configObservers_->SubscribeToFramework();
    NAccessibilityConfig::enableAbilityListsObservers_->SubscribeToFramework();
    HILOG_INFO("-----Init config module end------");
    return exports;
}
EXTERN_C_END

/*
 * Module define
 */
static napi_module _config_module = {
    .nm_version = 1,
    .nm_flags = 0,
    .nm_filename = nullptr,
    .nm_register_func = InitConfigModule,
    .nm_modname = "accessibility.config",
    .nm_priv = ((void*)0),
    .reserved = {0},
};
/*
 * Module register function
 */
extern "C" __attribute__((constructor)) void RegisterNapiAccessibilityConfigModule(void)
{
    napi_module_register(&_config_module);
}