/*
 * Copyright (C) 2025-2025 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 "anonymize_adapter.h"

#include "telephony_log_wrapper.h"

namespace OHOS {
namespace Telephony {
AnonymizeAdapter::AnonymizeAdapter()
{}

AnonymizeAdapter::~AnonymizeAdapter()
{}

void *AnonymizeAdapter::GetLibAnonymize()
{
    if (libAnonymize_ != nullptr) {
        return libAnonymize_;
    }

    libAnonymize_ = dlopen("libdia_sdk.z.so", RTLD_LAZY);
    if (libAnonymize_ == nullptr) {
        TELEPHONY_LOGE("libAnonymize_ is null");
    }

    return libAnonymize_;
}

void AnonymizeAdapter::ReleaseLibAnonymize()
{
    TELEPHONY_LOGI("ReleaseLibAnonymize");
    if (libAnonymize_ != nullptr) {
        dlclose(libAnonymize_);
        libAnonymize_ = nullptr;
    }
}

int AnonymizeAdapter::InitConfig(void **config)
{
    libAnonymize_ = GetLibAnonymize();
    if (libAnonymize_ == nullptr) {
        return -1;
    }

    PfnInitConfig func = reinterpret_cast<PfnInitConfig>(dlsym(libAnonymize_, "DIA_InitConfig"));
    if (func == nullptr) {
        TELEPHONY_LOGE("func is null");
        return -1;
    }

    return func(config);
}

int AnonymizeAdapter::SetRule(void *config, const DIA_String *key, const DIA_Rule *value)
{
    libAnonymize_ = GetLibAnonymize();
    if (libAnonymize_ == nullptr) {
        return -1;
    }

    PfnSetRule func = reinterpret_cast<PfnSetRule>(dlsym(libAnonymize_, "DIA_SetRule"));
    if (func == nullptr) {
        TELEPHONY_LOGE("func is null");
        return -1;
    }

    return func(config, key, value);
}

int AnonymizeAdapter::CreateAnonymize(void *config, void **anonymize)
{
    libAnonymize_ = GetLibAnonymize();
    if (libAnonymize_ == nullptr) {
        return -1;
    }

    PfnCreateAnonymize func = reinterpret_cast<PfnCreateAnonymize>(dlsym(libAnonymize_, "DIA_CreateAnonymize"));
    if (func == nullptr) {
        TELEPHONY_LOGE("func is null");
        return -1;
    }

    return func(config, anonymize);
}

int AnonymizeAdapter::IdentifyAnonymize(void *anonymize, const DIA_String *input, DIA_String **output)
{
    libAnonymize_ = GetLibAnonymize();
    if (libAnonymize_ == nullptr) {
        return -1;
    }

    PfnIdentifyAnonymize func = reinterpret_cast<PfnIdentifyAnonymize>(dlsym(libAnonymize_, "DIA_IdentifyAnonymize"));
    if (func == nullptr) {
        TELEPHONY_LOGE("func is null");
        return -1;
    }

    return func(anonymize, input, output);
}

int AnonymizeAdapter::ReleaseConfig(void **config)
{
    libAnonymize_ = GetLibAnonymize();
    if (libAnonymize_ == nullptr) {
        return -1;
    }

    PfnReleaseConfig func = reinterpret_cast<PfnReleaseConfig>(dlsym(libAnonymize_, "DIA_ReleaseConfig"));
    if (func == nullptr) {
        TELEPHONY_LOGE("func is null");
        return -1;
    }

    return func(config);
}

int AnonymizeAdapter::ReleaseAnonymize(void **anonymize)
{
    libAnonymize_ = GetLibAnonymize();
    if (libAnonymize_ == nullptr) {
        return -1;
    }

    PfnReleaseAonoymize func = reinterpret_cast<PfnReleaseAonoymize>(dlsym(libAnonymize_, "DIA_ReleaseAnonymize"));
    if (func == nullptr) {
        TELEPHONY_LOGE("func is null");
        return -1;
    }

    return func(anonymize);
}

int AnonymizeAdapter::ReleaseOutputData(DIA_String **output)
{
    libAnonymize_ = GetLibAnonymize();
    if (libAnonymize_ == nullptr) {
        return -1;
    }

    PfnReleaseOutputData func = reinterpret_cast<PfnReleaseOutputData>(dlsym(libAnonymize_, "DIA_ReleaseOutputData"));
    if (func == nullptr) {
        TELEPHONY_LOGE("func is null");
        return -1;
    }

    return func(output);
}
}
}