namespace MagicLeap.Android.NDK.NativeWindow
{
    using System;
    using System.Runtime.InteropServices;
    internal static class NativeWindowNativeBindings
    {
        public const string kLibraryName = "libnativewindow";
        [DllImport(kLibraryName, CallingConvention = CallingConvention.Cdecl)]
        public static extern void AHardwareBuffer_acquire(AHardwareBuffer buffer);
        [DllImport(kLibraryName, CallingConvention = CallingConvention.Cdecl)]
        public static extern int AHardwareBuffer_allocate(ref AHardwareBuffer.Description description,
            out AHardwareBuffer buffer);
        [DllImport(kLibraryName, CallingConvention = CallingConvention.Cdecl)]
        public static extern void AHardwareBuffer_describe(AHardwareBuffer buffer,
            out AHardwareBuffer.Description description);
#if ANDROID_API_LEVEL_31_OR_NEWER
        [DllImport(kLibraryName, CallingConvention = CallingConvention.Cdecl)]
        public static extern int AHardwareBuffer_getId(AHardwareBuffer buffer, out ulong outId);
#endif
        [DllImport(kLibraryName, CallingConvention = CallingConvention.Cdecl)]
        public static extern int AHardwareBuffer_isSupported(ref AHardwareBuffer.Description description);
        [DllImport(kLibraryName, CallingConvention = CallingConvention.Cdecl)]
        public static extern unsafe int AHardwareBuffer_lock(AHardwareBuffer buffer, AHardwareBuffer.Usage usage,
            int fence, ARect* rect, out void* virtualAddress);
        [DllImport(kLibraryName, CallingConvention = CallingConvention.Cdecl)]
        public static extern unsafe int AHardwareBuffer_lockAndGetInfo(AHardwareBuffer buffer,
            AHardwareBuffer.Usage usage, int fence, ARect* rect, out void* outVirtualAddress, out int outBytesPerPixel,
            out int outBytesPerStride);
        [DllImport(kLibraryName, CallingConvention = CallingConvention.Cdecl)]
        public static extern unsafe int AHardwareBuffer_lockPlanes(AHardwareBuffer buffer, AHardwareBuffer.Usage usage,
            int fenceFd, ARect* rect, out AHardwareBuffer.Planes outPlanes);
        [DllImport(kLibraryName, CallingConvention = CallingConvention.Cdecl)]
        public static extern int AHardwareBuffer_recvHandleFromUnixSocket(int socketFd, out AHardwareBuffer buffer);
        [DllImport(kLibraryName, CallingConvention = CallingConvention.Cdecl)]
        public static extern void AHardwareBuffer_release(AHardwareBuffer buffer);
        [DllImport(kLibraryName, CallingConvention = CallingConvention.Cdecl)]
        public static extern int AHardwareBuffer_sendHandleToUnixSocket(AHardwareBuffer buffer, int socketFd);
        [DllImport(kLibraryName, CallingConvention = CallingConvention.Cdecl)]
        public static extern unsafe int AHardwareBuffer_unlock(AHardwareBuffer buffer, int* fence);
    }
}