/*
 * Copyright 2022 Rémi Bernon for CodeWeavers
 *
 * This library is free software; you can redistribute it and/or
 * modify it under the terms of the GNU Lesser General Public
 * License as published by the Free Software Foundation; either
 * version 2.1 of the License, or (at your option) any later version.
 *
 * This library is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 * Lesser General Public License for more details.
 *
 * You should have received a copy of the GNU Lesser General Public
 * License along with this library; if not, write to the Free Software
 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
 */

#ifdef __WIDL__
#pragma winrt ns_prefix
#endif

import "inspectable.idl";
import "asyncinfo.idl";
import "eventtoken.idl";
import "windowscontracts.idl";
import "windows.foundation.idl";
import "windows.gaming.input.idl";
import "windows.storage.streams.idl";

namespace Windows.Gaming.Input.Custom {
    typedef enum XusbDeviceSubtype XusbDeviceSubtype;
    typedef enum XusbDeviceType XusbDeviceType;
    typedef struct GameControllerVersionInfo GameControllerVersionInfo;
    interface IGameControllerInputSink;
    interface IGameControllerProvider;
    interface IHidGameControllerInputSink;
    interface IHidGameControllerProvider;
    interface IXusbGameControllerInputSink;
    interface IXusbGameControllerProvider;
    interface ICustomGameControllerFactory;
    interface IGameControllerFactoryManagerStatics;
    interface IGameControllerFactoryManagerStatics2;
    runtimeclass GameControllerFactoryManager;
    runtimeclass HidGameControllerProvider;
    runtimeclass XusbGameControllerProvider;

    [contract(Windows.Foundation.UniversalApiContract, 3.0)]
    enum XusbDeviceSubtype
    {
        Unknown = 0,
        Gamepad = 1,
        ArcadePad = 2,
        ArcadeStick = 3,
        FlightStick = 4,
        Wheel = 5,
        Guitar = 6,
        GuitarAlternate = 7,
        GuitarBass = 8,
        DrumKit = 9,
        DancePad = 10,
    };

    [contract(Windows.Foundation.UniversalApiContract, 3.0)]
    enum XusbDeviceType
    {
        Unknown = 0,
        Gamepad = 1,
    };

    [contract(Windows.Foundation.UniversalApiContract, 3.0)]
    struct GameControllerVersionInfo
    {
        UINT16 Major;
        UINT16 Minor;
        UINT16 Build;
        UINT16 Revision;
    };

    [
        contract(Windows.Foundation.UniversalApiContract, 3.0),
        uuid(1ff6f922-c640-4c78-a820-9a715c558bcb)
    ]
    interface IGameControllerInputSink : IInspectable
    {
        HRESULT OnInputResumed([in] UINT64 timestamp);
        HRESULT OnInputSuspended([in] UINT64 timestamp);
    }

    [
        contract(Windows.Foundation.UniversalApiContract, 3.0),
        uuid(e6d73982-2996-4559-b16c-3e57d46e58d6)
    ]
    interface IGameControllerProvider : IInspectable
    {
        [propget] HRESULT FirmwareVersionInfo([out, retval] Windows.Gaming.Input.Custom.GameControllerVersionInfo *value);
        [propget] HRESULT HardwareProductId([out, retval] UINT16 *value);
        [propget] HRESULT HardwareVendorId([out, retval] UINT16 *value);
        [propget] HRESULT HardwareVersionInfo([out, retval] Windows.Gaming.Input.Custom.GameControllerVersionInfo *value);
        [propget] HRESULT IsConnected([out, retval] boolean *value);
    }

    [
        contract(Windows.Foundation.UniversalApiContract, 4.0),
        uuid(f754c322-182d-40e4-a126-fcee4ffa1e31)
    ]
    interface IHidGameControllerInputSink : IInspectable
        requires Windows.Gaming.Input.Custom.IGameControllerInputSink
    {
        HRESULT OnInputReportReceived([in] UINT64 timestamp, [in] BYTE id, [in] UINT32 report_len,
                                      [in, size_is(report_len)] BYTE *report_buf);
    }

    [
        contract(Windows.Foundation.UniversalApiContract, 4.0),
        exclusiveto(Windows.Gaming.Input.Custom.HidGameControllerProvider),
        uuid(95ce3af4-abf0-4b68-a081-3b7de73ff0e7)
    ]
    interface IHidGameControllerProvider : IInspectable
        requires Windows.Gaming.Input.Custom.IGameControllerProvider
    {
        [propget] HRESULT UsageId([out, retval] UINT16 *value);
        [propget] HRESULT UsagePage([out, retval] UINT16 *value);
        HRESULT GetFeatureReport([in] BYTE id, [in] UINT32 report_len,
                                 [out, size_is(report_len)] BYTE *report_buf);
        HRESULT SendFeatureReport([in] BYTE id, [in] UINT32 report_len,
                                  [in, size_is(report_len)] BYTE *report_buf);
        HRESULT SendOutputReport([in] BYTE id, [in] UINT32 report_len,
                                 [in, size_is(report_len)] BYTE *report_buf);
    }

    [
        contract(Windows.Foundation.UniversalApiContract, 3.0),
        uuid(b2ac1d95-6ecb-42b3-8aab-025401ca4712)
    ]
    interface IXusbGameControllerInputSink : IInspectable
        requires Windows.Gaming.Input.Custom.IGameControllerInputSink
    {
        HRESULT OnInputReceived([in] UINT64 timestamp, [in] BYTE id, [in] UINT32 report_len,
                                [in, size_is(report_len)] BYTE *report_buf);
    }

    [
        contract(Windows.Foundation.UniversalApiContract, 3.0),
        exclusiveto(Windows.Gaming.Input.Custom.XusbGameControllerProvider),
        uuid(6e2971eb-0efb-48b4-808b-837643b2f216)
    ]
    interface IXusbGameControllerProvider : IInspectable
        requires Windows.Gaming.Input.Custom.IGameControllerProvider
    {
        HRESULT SetVibration([in] DOUBLE rumble_intensity, [in] DOUBLE buzz_intensity);
    }

    [
        contract(Windows.Foundation.UniversalApiContract, 3.0),
        uuid(69a0ae5e-758e-4cbe-ace6-62155fe9126f)
    ]
    interface ICustomGameControllerFactory : IInspectable
    {
        HRESULT CreateGameController([in] Windows.Gaming.Input.Custom.IGameControllerProvider *provider,
                                     [out, retval] IInspectable **value);
        HRESULT OnGameControllerAdded([in] Windows.Gaming.Input.IGameController *value);
        HRESULT OnGameControllerRemoved([in] Windows.Gaming.Input.IGameController *value);
    }

    [
        contract(Windows.Foundation.UniversalApiContract, 3.0),
        exclusiveto(Windows.Gaming.Input.Custom.GameControllerFactoryManager),
        uuid(36cb66e3-d0a1-4986-a24c-40b137deba9e)
    ]
    interface IGameControllerFactoryManagerStatics : IInspectable
    {
        HRESULT RegisterCustomFactoryForGipInterface([in] Windows.Gaming.Input.Custom.ICustomGameControllerFactory *factory,
                                                     [in] GUID interfaceId);
        HRESULT RegisterCustomFactoryForHardwareId([in] Windows.Gaming.Input.Custom.ICustomGameControllerFactory *factory,
                                                   [in] UINT16 vendor_id, [in] UINT16 product_id);
        HRESULT RegisterCustomFactoryForXusbType([in] Windows.Gaming.Input.Custom.ICustomGameControllerFactory *factory,
                                                 [in] Windows.Gaming.Input.Custom.XusbDeviceType type,
                                                 [in] Windows.Gaming.Input.Custom.XusbDeviceSubtype subtype);
    }

    [
        contract(Windows.Foundation.UniversalApiContract, 4.0),
        exclusiveto(Windows.Gaming.Input.Custom.GameControllerFactoryManager),
        uuid(eace5644-19df-4115-b32a-2793e2aea3bb)
    ]
    interface IGameControllerFactoryManagerStatics2 : IInspectable
        requires Windows.Gaming.Input.Custom.IGameControllerFactoryManagerStatics
    {
        HRESULT TryGetFactoryControllerFromGameController([in] Windows.Gaming.Input.Custom.ICustomGameControllerFactory *factory,
                                                          [in] Windows.Gaming.Input.IGameController *controller,
                                                          [out, retval] Windows.Gaming.Input.IGameController **value);
    }

    [
        contract(Windows.Foundation.UniversalApiContract, 3.0),
        marshaling_behavior(agile),
        static(Windows.Gaming.Input.Custom.IGameControllerFactoryManagerStatics, Windows.Foundation.UniversalApiContract, 3.0),
        static(Windows.Gaming.Input.Custom.IGameControllerFactoryManagerStatics2, Windows.Foundation.UniversalApiContract, 4.0),
        threading(both)
    ]
    runtimeclass GameControllerFactoryManager
    {
    }

    [
        contract(Windows.Foundation.UniversalApiContract, 4.0),
        marshaling_behavior(agile),
        threading(both)
    ]
    runtimeclass HidGameControllerProvider
    {
        [default] interface Windows.Gaming.Input.Custom.IHidGameControllerProvider;
        interface Windows.Gaming.Input.Custom.IGameControllerProvider;
    }

    [
        contract(Windows.Foundation.UniversalApiContract, 3.0),
        marshaling_behavior(agile),
        threading(both)
    ]
    runtimeclass XusbGameControllerProvider
    {
        [default] interface Windows.Gaming.Input.Custom.IXusbGameControllerProvider;
        interface Windows.Gaming.Input.Custom.IGameControllerProvider;
    }
}
