/*
 * 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.
 */

#ifndef CAMERA_MANAGER_ADAPTER_H
#define CAMERA_MANAGER_ADAPTER_H

#include <memory>
#include <string>
#include <vector>

namespace OHOS::NWeb {

enum class CameraErrorType : int32_t {
    CAMERA_NOT_CLOSE,
    INPUT_ALREADY_INIT,
    CAMERA_MANAGER_IS_NULL,
    GET_CAMERA_OBJ_FAILED,
    CREATE_INPUT_FAILED,
    INPUT_OPEN_FAILED,
    INPUT_NOT_INIT,
    CREATE_PREVIEW_SURFACE_FAILED,
    CREATE_PREVIEW_OUTPUT_FAILED,
    CREATE_CAPTURE_SESSION_FAILED,
    ADD_INPUT_FAILED,
    ADD_OUTPUT_FAILED,
    COMMIT_CONFIG_FAILED,
    START_SESSION_FAILED,
    INPUT_OR_OUTPUT_IS_NULL,
};

enum class VideoTransportType : int32_t {
    VIDEO_TRANS_TYPE_BUILD_IN,
    VIDEO_TRANS_TYPE_USB,
    VIDEO_TRANS_TYPE_REMOTE,
    VIDEO_TRANS_TYPE_OTHER
};

enum class VideoFacingModeAdapter : int32_t { FACING_NONE = 0, FACING_USER, FACING_ENVIRONMENT, NUM_FACING_MODES };

enum class VideoPixelFormatAdapter : int32_t {
    FORMAT_RGBA_8888,
    FORMAT_YCBCR_420_888,
    FORMAT_YUV_420_SP,
    FORMAT_JPEG,
    FORMAT_UNKNOWN
};

enum class ExposureModeAdapter : int32_t {
    EXPOSURE_MODE_UNSUPPORTED = -1,
    EXPOSURE_MODE_LOCKED = 0,
    EXPOSURE_MODE_AUTO,
    EXPOSURE_MODE_CONTINUOUS_AUTO
};

enum class FocusModeAdapter : int32_t {
    FOCUS_MODE_MANUAL = 0,
    FOCUS_MODE_CONTINUOUS_AUTO,
    FOCUS_MODE_AUTO,
    FOCUS_MODE_LOCKED,
};

enum class FlashModeAdapter : int32_t {
    FLASH_MODE_CLOSE = 0,
    FLASH_MODE_OPEN,
    FLASH_MODE_AUTO,
    FLASH_MODE_ALWAYS_OPEN,
};

enum class RangeIDAdapter : int32_t {
    RANGE_ID_EXP_COMPENSATION,
};

enum class CameraStopType : int32_t { TO_BACK = 0, NORMAL };

enum class CameraStatusAdapter : int32_t {
    APPEAR = 0,
    DISAPPEAR,
    AVAILABLE,
    UNAVAILABLE,
};

enum class FlashStatusAdapter : int32_t {
    OFF = 0,
    ON,
    UNAVAILABLE,
};

enum CameraManagerAdapterCode : int32_t {
    CAMERA_OK = 0,
    CAMERA_ERROR = -1,
    CAMERA_NULL_ERROR = -2,
};

class VideoControlSupportAdapter {
public:
    VideoControlSupportAdapter() = default;

    virtual ~VideoControlSupportAdapter() = default;

    virtual bool GetPan() = 0;

    virtual bool GetTilt() = 0;

    virtual bool GetZoom() = 0;
};

class FormatAdapter {
public:
    FormatAdapter() = default;

    virtual ~FormatAdapter() = default;

    virtual uint32_t GetWidth() = 0;

    virtual uint32_t GetHeight() = 0;

    virtual float GetFrameRate() = 0;

    virtual VideoPixelFormatAdapter GetPixelFormat() = 0;
};

class VideoDeviceDescriptorAdapter {
public:
    VideoDeviceDescriptorAdapter() = default;

    virtual ~VideoDeviceDescriptorAdapter() = default;

    virtual std::string GetDisplayName() = 0;

    virtual std::string GetDeviceId() = 0;

    virtual std::string GetModelId() = 0;

    virtual std::shared_ptr<VideoControlSupportAdapter> GetControlSupport() = 0;

    virtual VideoTransportType GetTransportType() = 0;

    virtual VideoFacingModeAdapter GetFacingMode() = 0;

    virtual std::vector<std::shared_ptr<FormatAdapter>> GetSupportCaptureFormats() = 0;
};

class VideoCaptureParamsAdapter {
public:
    VideoCaptureParamsAdapter() = default;

    virtual ~VideoCaptureParamsAdapter() = default;

    virtual uint32_t GetWidth() = 0;

    virtual uint32_t GetHeight() = 0;

    virtual float GetFrameRate() = 0;

    virtual VideoPixelFormatAdapter GetPixelFormat() = 0;

    virtual bool GetEnableFaceDetection() = 0;
};

class VideoCaptureRangeAdapter {
public:
    VideoCaptureRangeAdapter() = default;

    virtual ~VideoCaptureRangeAdapter() = default;

    virtual double GetMin() = 0;

    virtual double GetMax() = 0;

    virtual double GetStep() = 0;

    virtual double GetCurrent() = 0;
};

class CameraRotationInfoAdapter {
public:
    CameraRotationInfoAdapter() = default;

    virtual ~CameraRotationInfoAdapter() = default;

    virtual int32_t GetRotation() = 0;

    virtual bool GetIsFlipX() = 0;

    virtual bool GetIsFlipY() = 0;
};

class CameraSurfaceBufferAdapter {
public:
    CameraSurfaceBufferAdapter() = default;

    virtual ~CameraSurfaceBufferAdapter() = default;

    virtual int32_t GetFileDescriptor() = 0;

    virtual int32_t GetWidth() = 0;

    virtual int32_t GetHeight() = 0;

    virtual int32_t GetStride() = 0;

    virtual int32_t GetFormat() = 0;

    virtual uint32_t GetSize() = 0;

    virtual uint8_t* GetBufferAddr() = 0;

protected:
    CameraSurfaceBufferAdapter(const CameraSurfaceBufferAdapter&) = delete;

    CameraSurfaceBufferAdapter& operator=(const CameraSurfaceBufferAdapter&) = delete;
};

class CameraSurfaceAdapter {
public:
    CameraSurfaceAdapter() = default;

    virtual ~CameraSurfaceAdapter() = default;

    virtual int32_t ReleaseBuffer(std::shared_ptr<CameraSurfaceBufferAdapter> buffer, int32_t fence) = 0;
};

class CameraBufferListenerAdapter {
public:
    virtual ~CameraBufferListenerAdapter() = default;

    virtual void OnBufferAvailable(std::shared_ptr<CameraSurfaceAdapter> surface,
        std::shared_ptr<CameraSurfaceBufferAdapter> buffer,
        std::shared_ptr<CameraRotationInfoAdapter> rotationInfo) = 0;
};

class CameraStatusCallbackAdapter {
public:
    virtual ~CameraStatusCallbackAdapter() = default;

    virtual void OnCameraStatusChanged(CameraStatusAdapter cameraStatusAdapter, const std::string callBackDeviceId) = 0;

    virtual void OnFlashlightStatusChanged(FlashStatusAdapter flashStatusAdapter, const std::string cameraID) = 0;
};

class CameraManagerAdapter {
public:
    CameraManagerAdapter() = default;

    virtual ~CameraManagerAdapter() = default;

    virtual int32_t Create(std::shared_ptr<CameraStatusCallbackAdapter> cameraStatusCallback) = 0;

    virtual std::vector<std::shared_ptr<VideoDeviceDescriptorAdapter>> GetDevicesInfo() = 0;

    virtual int32_t ReleaseCameraManger() = 0;

    virtual int32_t GetExposureModes(std::vector<ExposureModeAdapter>& exposureModesAdapter) = 0;

    virtual int32_t GetCurrentExposureMode(ExposureModeAdapter& exposureModeAdapter) = 0;

    virtual std::shared_ptr<VideoCaptureRangeAdapter> GetCaptionRangeById(RangeIDAdapter rangeId) = 0;

    virtual bool IsFocusModeSupported(FocusModeAdapter focusMode) = 0;

    virtual FocusModeAdapter GetCurrentFocusMode() = 0;

    virtual bool IsFlashModeSupported(FlashModeAdapter flashMode) = 0;

    virtual int32_t GetSupportedFlashModes(std::vector<FlashModeAdapter>& flashModesAdapter) = 0;

    virtual bool HasFlash() = 0;

    virtual FlashModeAdapter GetFlashMode() = 0;

    virtual int32_t SetFlashMode(FlashModeAdapter flashMode) = 0;

    virtual int32_t RestartSession() = 0;

    virtual int32_t StopSession(CameraStopType stopType) = 0;

    virtual CameraStatusAdapter GetCameraStatus() = 0;

    virtual bool IsExistCaptureTask() = 0;

    virtual int32_t StartStream(const std::string& deviceId,
        const std::shared_ptr<VideoCaptureParamsAdapter> captureParams,
        std::shared_ptr<CameraBufferListenerAdapter> listener) = 0;

    virtual void SetForegroundFlag(bool isForeground) = 0;

    virtual void SetCameraStatus(CameraStatusAdapter status) = 0;

    virtual std::string GetCurrentDeviceId() = 0;
};

} // namespace OHOS::NWeb

#endif // CAMERA_MANAGER_ADAPTER_H