/*
 * Copyright (C) 2023 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.
 */
/**
 * @addtogroup OH_Camera
 * @{
 *
 * @brief Provide the definition of the C interface for the camera module.
 *
 * @since 11
 * @version 1.0
 */
/**
 * @file camera_manager.h
 *
 * @brief The file declares the camera manager concepts.
 * 
 * @library libohcamera.so
 * @kit CameraKit
 * @syscap SystemCapability.Multimedia.Camera.Core
 * @since 11
 * @version 1.0
 */

#ifndef NATIVE_INCLUDE_CAMERA_CAMERA_MANAGER_H
#define NATIVE_INCLUDE_CAMERA_CAMERA_MANAGER_H

#include <stdint.h>
#include <stdio.h>
#include <stdbool.h>
#include "camera.h"
#include "camera_input.h"
#include "capture_session.h"
#include "preview_output.h"
#include "video_output.h"
#include "photo_output.h"
#include "metadata_output.h"

#ifdef __cplusplus
extern "C" {
#endif

/**
 * @brief Defines the callback defined in the {@link CameraManager_Callbacks} struct and used to report the camera
 * manager status.
 * 
 * @param cameraManager Pointer to the **Camera_Manager** instance that transfers the callback.
 * @param status Pointer to the status information of each camera.
 * @since 11
 */
typedef void (*OH_CameraManager_StatusCallback)(Camera_Manager* cameraManager, Camera_StatusInfo* status);

/**
 * @brief Defines the callback to listen for flashlight status changes.
 * 
 * @param cameraManager Pointer to the **Camera_Manager** instance that transfers the callback.
 * @param status Pointer to the flashlight status information.
 * @since 12
 */
typedef void (*OH_CameraManager_TorchStatusCallback)(Camera_Manager* cameraManager, Camera_TorchStatusInfo* status);

/**
 * @brief Defines the callback to listen for fold status changes of the camera manager.
 * 
 * @param cameraManager Pointer to the **Camera_Manager** instance that transfers the callback.
 * @param foldStatusInfo Pointer to the fold status information of the device.
 * @since 13
 */
typedef void (*OH_CameraManager_OnFoldStatusInfoChange)(Camera_Manager* cameraManager,
    Camera_FoldStatusInfo* foldStatusInfo);

/**
 * @brief The struct describes the callbacks used to listen for camera status changes.
 * 
 * @see OH_CameraManager_RegisterCallback
 * @since 11
 * @version 1.0
 */
typedef struct CameraManager_Callbacks {
    /**
     * Camera status change event.
     */
    OH_CameraManager_StatusCallback onCameraStatus;
} CameraManager_Callbacks;

/**
 * @brief Registers a callback to listen for camera status changes.
 * 
 * @param cameraManager Pointer to the **Camera_Manager** instance.
 * @param callback Pointer to the target callback.
 * @return **CAMERA_OK**: The operation is successful.
 *     <br>**CAMERA_INVALID_ARGUMENT**: A parameter is missing or the parameter type is incorrect.
 * @since 11
 */
Camera_ErrorCode OH_CameraManager_RegisterCallback(Camera_Manager* cameraManager, CameraManager_Callbacks* callback);

/**
 * @brief Unregisters the callback used to listen for camera status changes.
 * 
 * @param cameraManager Pointer to the **Camera_Manager** instance.
 * @param callback Pointer to the target callback.
 * @return **CAMERA_OK**: The operation is successful.
 *     <br>**CAMERA_INVALID_ARGUMENT**: A parameter is missing or the parameter type is incorrect.
 * @since 11
 */
Camera_ErrorCode OH_CameraManager_UnregisterCallback(Camera_Manager* cameraManager, CameraManager_Callbacks* callback);

/**
 * @brief Registers a callback to listen for flashlight status changes.
 * 
 * @param cameraManager Pointer to the **Camera_Manager** instance.
 * @param torchStatusCallback Target callback.
 * @return **CAMERA_OK**: The operation is successful.
 *     <br>**CAMERA_INVALID_ARGUMENT**: A parameter is missing or the parameter type is incorrect.
 * @since 12
 */
Camera_ErrorCode OH_CameraManager_RegisterTorchStatusCallback(Camera_Manager* cameraManager,
    OH_CameraManager_TorchStatusCallback torchStatusCallback);

/**
 * @brief Unregisters the callback used to listen for flashlight status changes.
 * 
 * @param cameraManager Pointer to the **Camera_Manager** instance.
 * @param torchStatusCallback Target callback.
 * @return **CAMERA_OK**: The operation is successful.
 *     <br>**CAMERA_INVALID_ARGUMENT**: A parameter is missing or the parameter type is incorrect.
 * @since 12
 */
Camera_ErrorCode OH_CameraManager_UnregisterTorchStatusCallback(Camera_Manager* cameraManager,
    OH_CameraManager_TorchStatusCallback torchStatusCallback);

/**
 * @brief Registers a callback to listen for fold status changes.
 * 
 * @param cameraManager Pointer to the **Camera_Manager** instance.
 * @param foldStatusInfoCallback Target callback.
 * @return **CAMERA_OK**: The operation is successful.
 *     <br>**CAMERA_INVALID_ARGUMENT**: A parameter is missing or the parameter type is incorrect.
 * @since 13
 */
Camera_ErrorCode OH_CameraManager_RegisterFoldStatusInfoCallback(Camera_Manager* cameraManager,
    OH_CameraManager_OnFoldStatusInfoChange foldStatusInfoCallback);

/**
 * @brief Unregisters the callback used to listen for fold status changes.
 * 
 * @param cameraManager Pointer to the **Camera_Manager** instance.
 * @param foldStatusInfoCallback Target callback.
 * @return **CAMERA_OK**: The operation is successful.
 *     <br>**CAMERA_INVALID_ARGUMENT**: A parameter is missing or the parameter type is incorrect.
 * @since 13
 */
Camera_ErrorCode OH_CameraManager_UnregisterFoldStatusInfoCallback(Camera_Manager* cameraManager,
    OH_CameraManager_OnFoldStatusInfoChange foldStatusInfoCallback);

/**
 * @brief Obtains the supported cameras.
 * 
 * @param cameraManager Pointer to the **Camera_Manager** instance.
 * @param cameras Double pointer to the list of cameras, which are defined in the Camera_Device struct, if the function
 * is successfully called.
 * @param size Pointer to the size of the list of cameras.
 * @return **CAMERA_OK**: The operation is successful.
 *     <br>**CAMERA_INVALID_ARGUMENT**: A parameter is missing or the parameter type is incorrect.
 * @since 11
 */
Camera_ErrorCode OH_CameraManager_GetSupportedCameras(Camera_Manager* cameraManager,
    Camera_Device** cameras, uint32_t* size);

/**
 * @brief Deletes supported cameras.
 * 
 * @param cameraManager Pointer to the **Camera_Manager** instance.
 * @param cameras Pointer to a list of cameras, which are defined in the Camera_Device struct.
 * @param size The size of the list of cameras.
 * @return **CAMERA_OK**: The operation is successful.
 *     <br>**CAMERA_INVALID_ARGUMENT**: A parameter is missing or the parameter type is incorrect.
 * @since 11
 */
Camera_ErrorCode OH_CameraManager_DeleteSupportedCameras(Camera_Manager* cameraManager,
    Camera_Device* cameras, uint32_t size);

/**
 * @brief Obtains the output capability supported by a camera.
 * 
 * @param cameraManager Pointer to the **Camera_Manager** instance.
 * @param cameras the {@link Camera_Device} to be queried.
 * @param cameraOutputCapability Double pointer to the output capability, which is defined in the
 * Camera_OutputCapability struct, if the function is successfully called.
 * @return **CAMERA_OK**: The operation is successful.
 *     <br>**CAMERA_INVALID_ARGUMENT**: A parameter is missing or the parameter type is incorrect.
 * @since 11
 */
Camera_ErrorCode OH_CameraManager_GetSupportedCameraOutputCapability(Camera_Manager* cameraManager,
    const Camera_Device* camera, Camera_OutputCapability** cameraOutputCapability);

/**
 * @brief Obtains the output capability supported by a camera in the specified mode.
 * 
 * @param cameraManager Pointer to the **Camera_Manager** instance.
 * @param camera Pointer to the **Camera_Device** instance.
 * @param sceneMode Scene mode.
 * @param cameraOutputCapability Double pointer to output capability, which is defined in the **Camera_OutputCapability*
 * * struct, if the function is successfully called.
 * @return **CAMERA_OK**: The operation is successful.
 *     <br>**CAMERA_INVALID_ARGUMENT**: A parameter is missing or the parameter type is incorrect.
 *     <br>**CAMERA_SERVICE_FATAL_ERROR**: The camera service is abnormal.
 * @since 12
 */
Camera_ErrorCode OH_CameraManager_GetSupportedCameraOutputCapabilityWithSceneMode(Camera_Manager* cameraManager,
    const Camera_Device* camera, Camera_SceneMode sceneMode, Camera_OutputCapability** cameraOutputCapability);

/**
 * @brief Obtains the complete output capabilities supported by a specified camera in a specified mode, including YUV,
 * HEIF, and HDR. Before using YUV, HEIF, or HDR, you need to explicitly call this method to ensure that the complete
 * output capabilities are obtained.
 * 
 * @param cameraManager Pointer to the **Camera_Manager** instance.
 * @param camera Pointer to the **Camera_Device** instance.
 * @param sceneMode Scene mode.
 * @param cameraOutputCapability Double pointer to output capability, which is defined in the **Camera_OutputCapability*
 * * struct, if the function is successfully called.
 * @return **CAMERA_OK**: The operation is successful.
 *     <br>**CAMERA_INVALID_ARGUMENT**: A parameter is missing or the parameter type is incorrect.
 *     <br>**CAMERA_SERVICE_FATAL_ERROR**: The camera service is abnormal.
 * @since 23
 */
Camera_ErrorCode OH_CameraManager_GetSupportedFullCameraOutputCapabilityWithSceneMode(Camera_Manager* cameraManager,
    const Camera_Device* camera, Camera_SceneMode sceneMode, Camera_OutputCapability** cameraOutputCapability);

/**
 * @brief Deletes the output capability supported by a camera.
 * 
 * @param cameraManager Pointer to the **Camera_Manager** instance.
 * @param cameraOutputCapability Pointer to the output capability, which is defined in the **Camera_OutputCapability**
 * struct.
 * @return **CAMERA_OK**: The operation is successful.
 *     <br>**CAMERA_INVALID_ARGUMENT**: A parameter is missing or the parameter type is incorrect.
 * @since 11
 */
Camera_ErrorCode OH_CameraManager_DeleteSupportedCameraOutputCapability(Camera_Manager* cameraManager,
    Camera_OutputCapability* cameraOutputCapability);

/**
 * @brief Checks whether a camera is muted.
 * 
 * @param cameraManager Pointer to the **Camera_Manager** instance.
 * @param isCameraMuted Pointer to the check result for whether the camera is muted, if the function is successfully
 * called. **true** if muted, **false** otherwise.
 * @return **CAMERA_OK**: The operation is successful.
 *     <br>**CAMERA_INVALID_ARGUMENT**: A parameter is missing or the parameter type is incorrect.
 * @since 11
 */
Camera_ErrorCode OH_CameraManager_IsCameraMuted(Camera_Manager* cameraManager, bool* isCameraMuted);

/**
 * @brief Creates a **CaptureSession** instance.
 * 
 * @param cameraManager Pointer to the **Camera_Manager** instance.
 * @param captureSession Double pointer to the **Camera_CaptureSession** instance created, if the function is
 * successfully called.
 * @return **CAMERA_OK**: The operation is successful.
 *     <br>**CAMERA_INVALID_ARGUMENT**: A parameter is missing or the parameter type is incorrect.
 *     <br>**CAMERA_SERVICE_FATAL_ERROR**: The camera service is abnormal.
 * @since 11
 */
Camera_ErrorCode OH_CameraManager_CreateCaptureSession(Camera_Manager* cameraManager,
    Camera_CaptureSession** captureSession);

/**
 * @brief Creates a **Camera_Input** instance.
 * 
 * @param cameraManager Pointer to the **Camera_Manager** instance.
 * @param camera Pointer to the **Camera_Device** instance.
 * @param cameraInput Double pointer to the **Camera_Input** instance created, if the function is successfully called.
 * @return **CAMERA_OK**: The operation is successful.
 *     <br>**CAMERA_INVALID_ARGUMENT**: A parameter is missing or the parameter type is incorrect.
 *     <br>**CAMERA_SERVICE_FATAL_ERROR**: The camera service is abnormal.
 * @permission ohos.permission.CAMERA
 * @since 11
 */
Camera_ErrorCode OH_CameraManager_CreateCameraInput(Camera_Manager* cameraManager,
    const Camera_Device* camera, Camera_Input** cameraInput);

/**
 * @brief Creates a **Camera_Input** instance with the specified camera position and type.
 * 
 * @param cameraManager Pointer to the **Camera_Manager** instance.
 * @param position Camera position.
 * @param type Camera type.
 * @param cameraInput Double pointer to the **Camera_Input** instance created, if the function is successfully called.
 * @return **CAMERA_OK**: The operation is successful.
 *     <br>**CAMERA_INVALID_ARGUMENT**: A parameter is missing or the parameter type is incorrect.
 *     <br>**CAMERA_SERVICE_FATAL_ERROR**: The camera service is abnormal.
 * @permission ohos.permission.CAMERA
 * @since 11
 */
Camera_ErrorCode OH_CameraManager_CreateCameraInput_WithPositionAndType(Camera_Manager* cameraManager,
    Camera_Position position, Camera_Type type, Camera_Input** cameraInput);

/**
 * @brief Creates a **PreviewOutput** instance.
 * 
 * @param cameraManager Pointer to the **Camera_Manager** instance.
 * @param profile Pointer to the profile used for creating the **Camera_PreviewOutput** instance.
 * @param surfaceId Pointer to the surface ID used for creating the **Camera_PreviewOutput** instance.
 * @param previewOutput Double pointer to the **Camera_PreviewOutput** instance created, if the function is
 * successfully called.
 * @return **CAMERA_OK**: The operation is successful.
 *     <br>**CAMERA_INVALID_ARGUMENT**: A parameter is missing or the parameter type is incorrect.
 *     <br>**CAMERA_SERVICE_FATAL_ERROR**: The camera service is abnormal.
 * @since 11
 */
Camera_ErrorCode OH_CameraManager_CreatePreviewOutput(Camera_Manager* cameraManager, const Camera_Profile* profile,
    const char* surfaceId, Camera_PreviewOutput** previewOutput);

/**
 * @brief Creates a **PreviewOutput** instance to be used in a preconfiguration stream.
 * 
 * @param cameraManager Pointer to the **Camera_Manager** instance.
 * @param surfaceId Pointer to the surface ID used for creating the **Camera_PreviewOutput** instance.
 * @param previewOutput Double pointer to the **Camera_PreviewOutput** instance created, if the function is
 * successfully called.
 * @return **CAMERA_OK**: The operation is successful.
 *     <br>**CAMERA_INVALID_ARGUMENT**: A parameter is missing or the parameter type is incorrect.
 *     <br>**CAMERA_SERVICE_FATAL_ERROR**: The camera service is abnormal.
 * @since 12
 */
Camera_ErrorCode OH_CameraManager_CreatePreviewOutputUsedInPreconfig(Camera_Manager* cameraManager,
    const char* surfaceId, Camera_PreviewOutput** previewOutput);

/**
 * @brief Create a defer preview output instance.The caller must call {@link OH_PreviewOutput_Release}
 *     to free the memory of the output.
 *
 * @param cameraManager the {@link Camera_Manager} instance.
 * @param profile the {@link Camera_Profile} to create {@link Camera_PreviewOutput}.
 * @param previewOutput the {@link Camera_PreviewOutput} will be created if the method call succeeds.
 * @return {@link CAMERA_OK} if the method call succeeds.
 *         {@link CAMERA_INVALID_ARGUMENT} if parameter missing or parameter type incorrect.
 *         {@link CAMERA_SERVICE_FATAL_ERROR} if camera service fatal error.
 * @since 24
 */
Camera_ErrorCode OH_CameraManager_CreateDeferredPreviewOutput(const Camera_Manager* cameraManager,
    const Camera_Profile* profile, Camera_PreviewOutput** previewOutput);

/**
 * @brief Creates a **PhotoOutput** instance. This API can only be used to create a **PhotoOutput** object in JPEG
 * format.
 * 
 * @param cameraManager Pointer to the **Camera_Manager** instance.
 * @param profile Pointer to the profile used for creating the **Camera_PhotoOutput** instance.
 * @param surfaceId Pointer to the surface ID used for creating the **Camera_PhotoOutput** instance.
 * @param photoOutput Double pointer to the **Camera_PhotoOutput** instance created, if the function is successfully
 * called.
 * @return **CAMERA_OK**: The operation is successful.
 *     <br>**CAMERA_INVALID_ARGUMENT**: A parameter is missing or the parameter type is incorrect.
 *     <br>**CAMERA_SERVICE_FATAL_ERROR**: The camera service is abnormal.
 * @since 11
 */
Camera_ErrorCode OH_CameraManager_CreatePhotoOutput(Camera_Manager* cameraManager, const Camera_Profile* profile,
    const char* surfaceId, Camera_PhotoOutput** photoOutput);

/**
 * @brief Creates a **PhotoOutput** instance to be used in a preconfiguration stream.
 * 
 * @param cameraManager Pointer to the **Camera_Manager** instance.
 * @param surfaceId Pointer to the surface ID used for creating the **Camera_PhotoOutput** instance.
 * @param photoOutput Double pointer to the **Camera_PhotoOutput** instance created, if the function is successfully
 * called.
 * @return **CAMERA_OK**: The operation is successful.
 *     <br>**CAMERA_INVALID_ARGUMENT**: A parameter is missing or the parameter type is incorrect.
 *     <br>**CAMERA_SERVICE_FATAL_ERROR**: The camera service is abnormal.
 * @since 12
 */
Camera_ErrorCode OH_CameraManager_CreatePhotoOutputUsedInPreconfig(Camera_Manager* cameraManager,
    const char* surfaceId, Camera_PhotoOutput** photoOutput);

/**
 * @brief Creates a **PhotoOutput** instance. **surfaceId** is not required in this function.
 * 
 * @param cameraManager Pointer to the **Camera_Manager** instance.
 * @param profile Pointer to the profile used for creating the **Camera_PhotoOutput** instance.
 * @param photoOutput Double pointer to the **Camera_PhotoOutput** instance created, if the function is successfully
 * called.
 * @return **CAMERA_OK**: The operation is successful.
 *     <br>**CAMERA_INVALID_ARGUMENT**: A parameter is missing or the parameter type is incorrect.
 *     <br>**CAMERA_SERVICE_FATAL_ERROR**: The camera service is abnormal.
 * @since 12
 */
Camera_ErrorCode OH_CameraManager_CreatePhotoOutputWithoutSurface(Camera_Manager *cameraManager,
    const Camera_Profile *profile, Camera_PhotoOutput **photoOutput);

/**
 * @brief Creates a **VideoOutput** instance.
 * 
 * @param cameraManager Pointer to the **Camera_Manager** instance.
 * @param profile Pointer to the profile for creating the **Camera_VideoOutput** instance.
 * @param surfaceId Pointer to the surface ID used for creating the **Camera_VideoOutput** instance.
 * @param videoOutput Double pointer to the **Camera_VideoOutput** instance created, if the function is successfully
 * called.
 * @return **CAMERA_OK**: The operation is successful.
 *     <br>**CAMERA_INVALID_ARGUMENT**: A parameter is missing or the parameter type is incorrect.
 *     <br>**CAMERA_SERVICE_FATAL_ERROR**: The camera service is abnormal.
 * @since 11
 */
Camera_ErrorCode OH_CameraManager_CreateVideoOutput(Camera_Manager* cameraManager, const Camera_VideoProfile* profile,
    const char* surfaceId, Camera_VideoOutput** videoOutput);

/**
 * @brief Creates a **VideoOutput** instance to be used in a preconfiguration stream.
 * 
 * @param cameraManager Pointer to the **Camera_Manager** instance.
 * @param surfaceId Pointer to the surface ID used for creating the **Camera_VideoOutput** instance.
 * @param videoOutput Double pointer to the **Camera_VideoOutput** instance created, if the function is successfully
 * called.
 * @return **CAMERA_OK**: The operation is successful.
 *     <br>**CAMERA_INVALID_ARGUMENT**: A parameter is missing or the parameter type is incorrect.
 *     <br>**CAMERA_SERVICE_FATAL_ERROR**: The camera service is abnormal.
 * @since 12
 */
Camera_ErrorCode OH_CameraManager_CreateVideoOutputUsedInPreconfig(Camera_Manager* cameraManager,
    const char* surfaceId, Camera_VideoOutput** videoOutput);

/**
 * @brief Creates a **MetadataOutput** instance.
 * 
 * @param cameraManager Pointer to the **Camera_Manager** instance.
 * @param profile Pointer to the metadata object type used for creating the **Camera_MetadataOutput** instance.
 * @param metadataOutput Double pointer to the **Camera_MetadataOutput** instance created, if the function is
 * successfully called.
 * @return **CAMERA_OK**: The operation is successful.
 *     <br>**CAMERA_INVALID_ARGUMENT**: A parameter is missing or the parameter type is incorrect.
 *     <br>**CAMERA_SERVICE_FATAL_ERROR**: The camera service is abnormal.
 * @since 11
 */
Camera_ErrorCode OH_CameraManager_CreateMetadataOutput(Camera_Manager* cameraManager,
    const Camera_MetadataObjectType* profile, Camera_MetadataOutput** metadataOutput);

/**
 * @brief Creates a **metadataOutput** instance using an array of metadata object types.
 * 
 * @param cameraManager Pointer to the **Camera_Manager** instance.
 * @param metadataObjectTypes Pointer to the metadata object types used for creating the **Camera_MetadataOutput**
 * instance.
 * @param size Length of the metadata object type array.
 * @param metadataOutput Double pointer to the **Camera_MetadataOutput** instance created, if the function is
 * successfully called.
 * @return **CAMERA_OK**: The operation is successful.
 *     <br>**CAMERA_INVALID_ARGUMENT**: A parameter is missing or the parameter type is incorrect.
 *     <br>**CAMERA_SERVICE_FATAL_ERROR**: The camera service is abnormal.
 * @since 23
 */
Camera_ErrorCode OH_CameraManager_CreateMetadataOutputWithObjectTypes(Camera_Manager* cameraManager,
    const Camera_MetadataObjectType* metadataObjectTypes, uint32_t size, Camera_MetadataOutput** metadataOutput);

/**
 * @brief Obtains the scene modes supported by a camera.
 * 
 * @param camera Pointer to the **Camera_Device** instance.
 * @param sceneModes Double pointer to the list of scene modes, which are defined in the Camera_SceneMode struct, if
 * the function is successfully called.
 * @param size Pointer to the size of the list of scene modes.
 * @return **CAMERA_OK**: The operation is successful.
 *     <br>**CAMERA_INVALID_ARGUMENT**: A parameter is missing or the parameter type is incorrect.
 *     <br>**CAMERA_SERVICE_FATAL_ERROR**: The camera service is abnormal.
 * @since 12
 */
Camera_ErrorCode OH_CameraManager_GetSupportedSceneModes(Camera_Device* camera,
    Camera_SceneMode** sceneModes, uint32_t* size);

/**
 * @brief Deletes scene modes.
 * 
 * @param cameraManager Pointer to the **Camera_Manager** instance.
 * @param sceneModes Pointer to the list of scene modes to delete.
 * @return **CAMERA_OK**: The operation is successful.
 *     <br>**CAMERA_INVALID_ARGUMENT**: A parameter is missing or the parameter type is incorrect.
 * @since 12
 */
Camera_ErrorCode OH_CameraManager_DeleteSceneModes(Camera_Manager* cameraManager, Camera_SceneMode* sceneModes);

/**
 * @brief Checks whether the device supports the flashlight.
 * 
 * @param cameraManager Pointer to the **Camera_Manager** instance.
 * @param isTorchSupported Pointer to the check result for the support of the flashlight. **true** if supported, **
 * false** otherwise.
 * @return **CAMERA_OK**: The operation is successful.
 *     <br>**CAMERA_INVALID_ARGUMENT**: A parameter is missing or the parameter type is incorrect.
 * @since 12
 */
Camera_ErrorCode OH_CameraManager_IsTorchSupported(Camera_Manager* cameraManager,
    bool* isTorchSupported);

/**
 * @brief Checks whether the device supports the specified flashlight mode.
 * 
 * @param cameraManager Pointer to the **Camera_Manager** instance.
 * @param torchMode Flashlight mode to check.
 * @param isTorchSupported Pointer to the check result for the support of the flashlight mode. **true** if supported, **
 * false** otherwise.
 * @return **CAMERA_OK**: The operation is successful.
 *     <br>**CAMERA_INVALID_ARGUMENT**: A parameter is missing or the parameter type is incorrect.
 *     <br>**CAMERA_SERVICE_FATAL_ERROR**: The camera service is abnormal.
 * @since 12
 */
Camera_ErrorCode OH_CameraManager_IsTorchSupportedByTorchMode(Camera_Manager* cameraManager,
    Camera_TorchMode torchMode, bool* isTorchSupported);

/**
 * @brief Sets a flashlight mode.
 * 
 * @param cameraManager Pointer to the **Camera_Manager** instance.
 * @param torchMode Flashlight mode to set.
 * @return **CAMERA_OK**: The operation is successful.
 *     <br>**CAMERA_INVALID_ARGUMENT**: A parameter is missing or the parameter type is incorrect.
 *     <br>**CAMERA_SERVICE_FATAL_ERROR**: The camera service is abnormal.
 * @since 12
 */
Camera_ErrorCode OH_CameraManager_SetTorchMode(Camera_Manager* cameraManager,
    Camera_TorchMode torchMode);

/**
 * @brief Checks whether the device supports flashlight brightness control.
 * 
 * @param cameraManager Pointer to the **Camera_Manager** instance.
 * @param isTorchLevelControlSupported Whether the device supports flashlight brightness control.
 * @return **CAMERA_OK**: The operation is successful.
 *     <br>**CAMERA_INVALID_ARGUMENT**: A parameter is missing or the parameter type is incorrect.
 *     <br>**CAMERA_SERVICE_FATAL_ERROR**: The camera service is abnormal.
 * @since 26.0.0
 */
Camera_ErrorCode OH_CameraManager_IsTorchLevelControlSupported(const Camera_Manager* cameraManager,
    bool* isTorchLevelControlSupported);

/**
 * @brief Turns on the flashlight and sets the brightness level.
 * 
 * @param cameraManager Pointer to the **Camera_Manager** instance.
 * @param torchLevel Target brightness level. The value range is [0.0, 1.0].
 * @return **CAMERA_OK**: The operation is successful.
 *     <br>**CAMERA_INVALID_ARGUMENT**: A parameter is missing or the parameter type is incorrect.
 *     <br>**CAMERA_SERVICE_FATAL_ERROR**: The camera service is abnormal.
 * @since 26.0.0
 */
Camera_ErrorCode OH_CameraManager_SetTorchModeOnWithLevel(Camera_Manager* cameraManager,
    double torchLevel);

/**
 * @brief Queries a specified device based on position and type.
 *
 * @param cameraManager the {@link Camera_Manager} instance.
 * @param position the {@link Camera_Position} instance.
 * @param type the {@link Camera_Type} instance.
 * @param camera the {@link Camera_Device} to be set.
 * @return {@link #CAMERA_OK} if the method call succeeds.
 *         {@link #CAMERA_INVALID_ARGUMENT} if parameter missing or parameter type incorrect.
 *         {@link #CAMERA_SERVICE_FATAL_ERROR} if camera service fatal error.
 * @since 18
 */
Camera_ErrorCode OH_CameraManager_GetCameraDevice(Camera_Manager* cameraManager, Camera_Position position,
    Camera_Type type, Camera_Device* camera);

/**
 * @brief Obtains the list of cameras that meet the search criteria based on the camera position, camera types, and
 * connection type.
 * 
 * @param cameraManager Pointer to the **Camera_Manager** instance.
 * @param deviceQueryInfo Camera device query information instance.
 * @param cameraSize Size of the list of supported cameras.
 * @param cameras List of supported cameras.
 * @return **CAMERA_OK**: The operation is successful.
 *     <br>**CAMERA_INVALID_ARGUMENT**: A parameter is missing or the parameter type is incorrect.
 *     <br>**CAMERA_SERVICE_FATAL_ERROR**: The camera service is abnormal.
 * @since 23
 */
Camera_ErrorCode OH_CameraManager_GetCameraDevices(Camera_Manager* cameraManager,
    Camera_DeviceQueryInfo* deviceQueryInfo, uint32_t* cameraSize, Camera_Device** cameras);

/**
 * @brief Deletes the specified camera.
 * 
 * @param cameraManager Pointer to the **Camera_Manager** instance.
 * @param cameras List of cameras to be deleted.
 * @return **CAMERA_OK**: The operation is successful.
 *     <br>**CAMERA_INVALID_ARGUMENT**: A parameter is missing or the parameter type is incorrect.
 * @since 23
 */
Camera_ErrorCode OH_CameraManager_DeleteCameraDevices(Camera_Manager* cameraManager, Camera_Device* cameras);

/**
 * @brief Obtains the concurrent information of specified cameras, the empty return means concurrency is not supported.
 *
 * @param cameraManager the {@link Camera_Manager} instance.
 * @param camera the {@link Camera_Device} instance.
 * @param deviceSize length of the input device array.
 * @param cameraConcurrentInfo the {@link Camera_ConcurrentInfo} to be set.
 * @param infoSize length of the returned concurrency information array.
 * @return {@link #CAMERA_OK} if the method call succeeds.
 *         {@link #CAMERA_INVALID_ARGUMENT} if parameter missing or parameter type incorrect.
 *         {@link #CAMERA_SERVICE_FATAL_ERROR} if camera service fatal error.
 * @since 18
 */
Camera_ErrorCode OH_CameraManager_GetCameraConcurrentInfos(Camera_Manager* cameraManager, const Camera_Device* camera,
    uint32_t deviceSize,
    Camera_ConcurrentInfo** cameraConcurrentInfo,
    uint32_t* infoSize);
#ifdef __cplusplus
}
#endif

#endif // NATIVE_INCLUDE_CAMERA_CAMERA_MANAGER_H
/** @} */