/*
 * Copyright 2023 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

#ifndef DO_NO_IMPORTS
import "inspectable.idl";
import "asyncinfo.idl";
import "eventtoken.idl";
import "windowscontracts.idl";
import "windows.foundation.idl";
import "windows.storage.streams.idl";
import "windows.system.idl";
#endif

namespace Windows.System.Profile {

    interface IAnalyticsInfoStatics;
    interface IAnalyticsInfoStatics2;
    interface IAnalyticsVersionInfo;
    interface IAnalyticsVersionInfo2;
    runtimeclass AnalyticsVersionInfo;
    runtimeclass AnalyticsInfo;

    [
        contract(Windows.Foundation.UniversalApiContract, 1.0),
        exclusiveto(Windows.System.Profile.AnalyticsInfo),
        uuid(1d5ee066-188d-5ba9-4387-acaeb0e7e305)
    ]
    interface IAnalyticsInfoStatics : IInspectable
    {
        [propget] HRESULT VersionInfo([out, retval] Windows.System.Profile.AnalyticsVersionInfo **value);
        [propget] HRESULT DeviceForm([out, retval] HSTRING *value);
    }

    [
        contract(Windows.Foundation.UniversalApiContract, 1.0),
        exclusiveto(Windows.System.Profile.AnalyticsVersionInfo),
        uuid(926130b8-9955-4c74-bdc1-7cd0decf9b03)
    ]
    interface IAnalyticsVersionInfo : IInspectable
    {
        [propget] HRESULT DeviceFamily([out, retval] HSTRING *value);
        [propget] HRESULT DeviceFamilyVersion([out, retval] HSTRING *value);
    }

    [
        contract(Windows.Foundation.UniversalApiContract, 1.0),
        marshaling_behavior(agile),
        threading(both)
    ]
    runtimeclass AnalyticsVersionInfo
    {
        [default] interface Windows.System.Profile.IAnalyticsVersionInfo;
        [contract(Windows.Foundation.UniversalApiContract, 11.0)] interface Windows.System.Profile.IAnalyticsVersionInfo2;
    }

    [
        contract(Windows.Foundation.UniversalApiContract, 1.0),
        marshaling_behavior(agile),
        static(Windows.System.Profile.IAnalyticsInfoStatics, Windows.Foundation.UniversalApiContract, 1.0),
        static(Windows.System.Profile.IAnalyticsInfoStatics2, Windows.Foundation.UniversalApiContract, 6.0),
        threading(both)
    ]
    runtimeclass AnalyticsInfo
    {
    }

}
