/*
 * Copyright (c) 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.
 */

#ifndef SECURITY_PRIVACY_MANAGER_PLUGIN_H
#define SECURITY_PRIVACY_MANAGER_PLUGIN_H

#include <string>
#include <stdio.h>
#include <stdlib.h>

#include <dlfcn.h>
#include <unistd.h>

namespace OHOS {
namespace Sensors {
class AppPolicyCallback {
public:
    AppPolicyCallback();
    virtual ~AppPolicyCallback();
    virtual void OnResult(int32_t result) = 0;
};

enum PolicyName {
    MOTION_SENSOR,
};

enum ObjectType {
    ACCESS_TOKEN_ID,
};

enum PolicyValue {
    CLOSE,
    OPEN
};

struct AppPolicyEventExt {
    std::string objectId;
    ObjectType objectType;
    std::string bundleName;
    PolicyName policyName;
    PolicyValue policyValue = PolicyValue::OPEN;
};

#if (defined(__aarch64__) || defined(__x86_64__))
const std::string SECURITY_PRIVACY_SDK_SO_PATH = "/system/lib64/libsps_app_policy_sdk.z.so";
#else
const std::string SECURITY_PRIVACY_SDK_SO_PATH = "/system/lib/libsps_app_policy_sdk.z.so";
#endif

using ModifyAppPolicyPtr = int32_t (*)(int32_t systemAbilityId, int32_t userId,
    const AppPolicyEventExt &appPolicyEvent);
using QueryAppPolicyByPolicyNamePtr = int32_t (*)(int32_t systemAbilityId, int32_t userId,
    PolicyName policyName, std::vector<AppPolicyEventExt> &appPolicies);
using RegisterAppPolicyObserverPtr = int32_t (*)(int32_t systemAbilityId, int32_t userId,
    const std::function<void()> &callback);
using UnregisterAppPolicyObserverPtr = int32_t (*)(int32_t systemAbilityId, int32_t userId);
using CreateAppPolicyDBPtr = int32_t (*)(int32_t userId, const std::shared_ptr<AppPolicyCallback> &callback);
bool LoadSecurityPrivacyServer(void);
void UnloadSecurityPrivacyServer(void);
int32_t ModifyAppPolicy(int32_t userId, const AppPolicyEventExt &appPolicyEvent);
int32_t QueryAppPolicyByPolicyName(int32_t userId, PolicyName policyName, std::vector<AppPolicyEventExt> &appPolicies);
int32_t RegisterAppPolicyObserver(int32_t userId, const std::function<void()> &callback);
int32_t UnregisterAppPolicyObserver(int32_t userId);
int32_t CreateAppPolicyDB(int32_t userId, const std::shared_ptr<AppPolicyCallback> &callback);
}
}
#endif /* SECURITY_PRIVACY_MANAGER_PLUGIN_H */