using Ryujinx.Horizon.Common;

namespace Ryujinx.Horizon.Sdk.OsTypes.Impl
{
    static class InterProcessEvent
    {
        public static Result Create(ref InterProcessEventType ipEvent, EventClearMode clearMode)
        {
            Result result = InterProcessEventImpl.Create(out int writableHandle, out int readableHandle);

            if (result != Result.Success)
            {
                return result;
            }

            ipEvent = new InterProcessEventType(
                clearMode == EventClearMode.AutoClear,
                true,
                true,
                readableHandle,
                writableHandle);

            return Result.Success;
        }

        public static void Destroy(ref InterProcessEventType ipEvent)
        {
            ipEvent.State = InitializationState.NotInitialized;

            if (ipEvent.ReadableHandleManaged)
            {
                if (ipEvent.ReadableHandle != 0)
                {
                    InterProcessEventImpl.Close(ipEvent.ReadableHandle);
                }

                ipEvent.ReadableHandleManaged = false;
            }

            if (ipEvent.WritableHandleManaged)
            {
                if (ipEvent.WritableHandle != 0)
                {
                    InterProcessEventImpl.Close(ipEvent.WritableHandle);
                }

                ipEvent.WritableHandleManaged = false;
            }
        }

        public static int DetachReadableHandle(ref InterProcessEventType ipEvent)
        {
            int handle = ipEvent.ReadableHandle;

            ipEvent.ReadableHandle = 0;
            ipEvent.ReadableHandleManaged = false;

            return handle;
        }

        public static int DetachWritableHandle(ref InterProcessEventType ipEvent)
        {
            int handle = ipEvent.WritableHandle;

            ipEvent.WritableHandle = 0;
            ipEvent.WritableHandleManaged = false;

            return handle;
        }

        public static int GetReadableHandle(ref InterProcessEventType ipEvent)
        {
            return ipEvent.ReadableHandle;
        }

        public static int GetWritableHandle(ref InterProcessEventType ipEvent)
        {
            return ipEvent.WritableHandle;
        }

        public static void Signal(ref InterProcessEventType ipEvent)
        {
            InterProcessEventImpl.Signal(ipEvent.WritableHandle);
        }

        public static void Clear(ref InterProcessEventType ipEvent)
        {
            InterProcessEventImpl.Clear(ipEvent.ReadableHandle == 0 ? ipEvent.WritableHandle : ipEvent.ReadableHandle);
        }
    }
}
