/****************************************************************************
* Copyright 2019 Nreal Techonology Limited. All rights reserved.
*                                                                                                                                                          
* This file is part of NRSDK.                                                                                                          
*                                                                                                                                                           
* https://www.nreal.ai/        
* 
*****************************************************************************/

namespace NRKernal
{
    using System;
    using System.Runtime.InteropServices;

    /// <summary> Callback, called when the camera image. </summary>
    /// <param name="rgb_camera_handle">       Handle of the RGB camera.</param>
    /// <param name="rgb_camera_image_handle"> Handle of the RGB camera image.</param>
    /// <param name="userdata">                The userdata.</param>
    [UnmanagedFunctionPointer(CallingConvention.Cdecl)]
    public delegate void CameraImageCallback(UInt64 rgb_camera_handle,
               UInt64 rgb_camera_image_handle, UInt64 userdata);

    /// <summary> Interface for camera data provider. </summary>
    public interface ICameraDataProvider
    {
        /// <summary> Creates a new bool. </summary>
        /// <returns> True if it succeeds, false if it fails. </returns>
        bool Create();

        /// <summary> Gets raw data. </summary>
        /// <param name="imageHandle"> Handle of the image.</param>
        /// <param name="eye">         The eye.</param>
        /// <param name="ptr">         [in,out] The pointer.</param>
        /// <param name="size">        [in,out] The size.</param>
        /// <returns> True if it succeeds, false if it fails. </returns>
        bool GetRawData(UInt64 imageHandle, int eye, ref IntPtr ptr, ref int size);

        /// <summary> Gets a resolution. </summary>
        /// <param name="imageHandle"> Handle of the image.</param>
        /// <param name="eye">         The eye.</param>
        /// <returns> The resolution. </returns>
        NativeResolution GetResolution(UInt64 imageHandle, int eye);

        /// <summary> Gets hmd time nanos. </summary>
        /// <param name="imageHandle"> Handle of the image.</param>
        /// <param name="eye">         The eye.</param>
        /// <returns> The hmd time nanos. </returns>
        UInt64 GetHMDTimeNanos(UInt64 imageHandle, int eye);

        /// <summary> Get exposure time. </summary>
        /// <param name="imageHandle"> Handle of the image. </param>
        /// <param name="eye">         The eye. </param>
        /// <returns> Exposure time of the image. </returns>
        UInt32 GetExposureTime(UInt64 imageHandle, int eye);

        /// <summary> Get Gain. </summary>
        /// <param name="imageHandle"> Handle of the image. </param>
        /// <param name="eye">         The eye. </param>
        /// <returns> Gain of the image. </returns>
        UInt32 GetGain(UInt64 imageHandle, int eye);

        /// <summary> Callback, called when the set capture. </summary>
        /// <param name="callback"> The callback.</param>
        /// <param name="userdata"> (Optional) The userdata.</param>
        /// <returns> True if it succeeds, false if it fails. </returns>
        bool SetCaptureCallback(CameraImageCallback callback, UInt64 userdata = 0);

        /// <summary> Sets image format. </summary>
        /// <param name="format"> Describes the format to use.</param>
        /// <returns> True if it succeeds, false if it fails. </returns>
        bool SetImageFormat(CameraImageFormat format);

        /// <summary> Starts a capture. </summary>
        /// <returns> True if it succeeds, false if it fails. </returns>
        bool StartCapture();

        /// <summary> Stops a capture. </summary>
        /// <returns> True if it succeeds, false if it fails. </returns>
        bool StopCapture();

        /// <summary> Destroys the image described by imageHandle. </summary>
        /// <param name="imageHandle"> Handle of the image.</param>
        /// <returns> True if it succeeds, false if it fails. </returns>
        bool DestroyImage(UInt64 imageHandle);

        /// <summary> Releases this object. </summary>
        /// <returns> True if it succeeds, false if it fails. </returns>
        bool Release();
    }
}