/*
 * 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.
 */
#ifndef FOUNDATION_RESOURCESCHEDULE_WORKSCHEDULER_INTERFACES_KITS_NAPI_INCLUDE_COMMON
#define FOUNDATION_RESOURCESCHEDULE_WORKSCHEDULER_INTERFACES_KITS_NAPI_INCLUDE_COMMON

#include <cstdint>
#include <cstddef>
#include <memory>
#include <string>

#include "napi/native_api.h"
#include "napi/native_node_api.h"
#include "work_info.h"

namespace OHOS {
namespace WorkScheduler {
struct AsyncWorkData {
    explicit AsyncWorkData(napi_env napiEnv);
    virtual ~AsyncWorkData();
    napi_env env;
    napi_async_work asyncWork = nullptr;
    napi_deferred deferred = nullptr;
    napi_ref callback = nullptr;
    bool isCallback = false;
    int32_t errorCode = 0;
    std::string errorMsg = "";
};

class Common {
public:
    /**
     * @brief Napi get null.
     *
     * @param env The env.
     * @return The result.
     */
    static napi_value NapiGetNull(napi_env env);
    /**
     * @brief Get the info of work.
     *
     * @param env The env.
     * @param objValue The obj value.
     * @param workInfo The info of work.
     * @return True if success,else false
     */
    static bool GetWorkInfo(napi_env env, napi_value objValue, WorkInfo &workInfo);
    /**
     * @brief Get int property.
     *
     * @param env The env.
     * @param object The object.
     * @param propertyName The name of property.
     * @param errCode Throw the errCode if failed.
     * @return Int value.
     */
    static int32_t GetIntProperty(napi_env env, napi_value object,
        const std::string &propertyName, ErrCode errCode);
    /**
     * @brief Get bool property.
     *
     * @param env The env.
     * @param object The object.
     * @param propertyName The name of property.
     * @param errCode Throw the errCode if failed.
     * @return True if success,else false
     */
    static bool GetBoolProperty(napi_env env, napi_value object,
        const std::string &propertyName, ErrCode errCode);
    /**
     * @brief Get bool to int property.
     *
     * @param env The env.
     * @param object The object.
     * @param propertyName The name of property.
     * @param errCode Throw the errCode if failed.
     * @return Bool to int property.
     */
    static int32_t GetBoolToIntProperty(napi_env env, napi_value object,
        const std::string &propertyName, ErrCode errCode);
    /**
     * @brief Get string property.
     *
     * @param env The env.
     * @param object The object.
     * @param propertyName The name of property.
     * @param errCode Throw the errCode if failed.
     * @return String property.
     */
    static std::string GetStringProperty(napi_env env, napi_value object,
        const std::string &propertyName, ErrCode errCode);
    /**
     * @brief Match value type.
     *
     * @param env The env.
     * @param value The value.
     * @param targetType The target type.
     * @return True if success,else false
     */
    static bool MatchValueType(napi_env env, napi_value value, napi_valuetype targetType);
    /**
     * @brief JS para error.
     *
     * @param env The env.
     * @param callback The callback.
     * @return Result or promise.
     */
    static napi_value JSParaError(const napi_env &env, const napi_ref &callback);
    /**
     * @brief Padding callback promise info.
     *
     * @param env The env
     * @param callback The callback.
     * @param info The info.
     * @param promise The promise.
     */
    static void PaddingAsyncWorkData(
        const napi_env &env, const napi_ref &callback, AsyncWorkData &info, napi_value &promise);
    /**
     * @brief Get the workInfo of napi.
     *
     * @param env The env.
     * @param workInfo The info of work.
     * @return Napi work info.
     */
    static napi_value GetNapiWorkInfo(napi_env env, std::shared_ptr<WorkInfo> &workInfo);
    /**
     * @brief Get the info of condition.
     *
     * @param env The env.
     * @param workInfo The info of work.
     * @return Napi work info.
     */
    static void GetConditionInfo(napi_env env, std::shared_ptr<WorkInfo> &workInfo, napi_value &napiWork);
    /**
     * @brief Get callback error value.
     *
     * @param env The env.
     * @param errCode The error code.
     * @param errMsg The error message.
     * @return Callback error value.
     */
    static napi_value GetCallbackErrorValue(napi_env env, int32_t errCode, const std::string errMsg);
    /**
     * @brief Set callback.
     *
     * @param env The env.
     * @param callbackIn The callback.
     * @param errCode The errCode.
     * @param result The result.
     */
    static void SetCallback(const napi_env &env, const napi_ref &callbackIn,
        int32_t errCode, const napi_value &result);
    /**
     * @brief Set promise.
     *
     * @param env The env.
     * @param info The info.
     * @param result The result.
     * @return The result.
     */
    static napi_value SetPromise(const napi_env &env, const AsyncWorkData &info, const napi_value &result);
    /**
     * @brief Return callback promise.
     *
     * @param env The env.
     * @param info The info.
     * @param result The result.
     */
    static void ReturnCallbackPromise(const napi_env &env, const AsyncWorkData &info,
        const napi_value &result);
    /**
     * @brief Handle error code and throw error.
     *
     * @param env The env.
     * @param errCode The error code.
     */
    static void HandleErrCode(const napi_env &env, int32_t errCode);
    /**
     * @brief Handle param error code and throw param error.
     *
     * @param env The env.
     * @param errCode The error code.
     */
    static void HandleParamErr(const napi_env &env, int32_t errCode);
    /**
     * @brief Find error message by code.
     *
     * @param env The env.
     * @param errCode The error code.
     */
    static std::string FindErrMsg(const napi_env &env, int32_t errCode);
    /**
     * @brief Find the error code actually reported by code.
     *
     * @param env The env.
     * @param errCode The error code.
     */
    static int32_t FindErrCode(const napi_env &env, int32_t errCodeIn);

private:
    static bool GetBaseWorkInfo(napi_env env, napi_value objValue, WorkInfo &workInfo);
    static bool GetNetWorkInfo(napi_env env, napi_value objValue, WorkInfo &workInfo);
    static bool GetChargeInfo(napi_env env, napi_value objValue, WorkInfo &workInfo);
    static bool GetBatteryInfo(napi_env env, napi_value objValue, WorkInfo &workInfo);
    static bool GetStorageInfo(napi_env env, napi_value objValue, WorkInfo &workInfo);
    static bool GetRepeatInfo(napi_env env, napi_value objValue, WorkInfo &workInfo);
    static bool GetExtrasInfo(napi_env env, napi_value objValue, WorkInfo &workInfo);
    static bool GetDeepIdleInfo(napi_env env, napi_value objValue, WorkInfo &workInfo);
};
} // namespace WorkScheduler
} // namespace OHOS
#endif // FOUNDATION_RESOURCESCHEDULE_WORKSCHEDULER_INTERFACES_KITS_NAPI_INCLUDE_COMMON