/*
 * Copyright (C) 2023 Mohamad Al-Jaf
 *
 * 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.devices.geolocation.idl";
/* import "windows.storage.idl"; */
import "windows.storage.streams.idl";

namespace Windows.Storage.FileProperties {
    typedef enum PhotoOrientation PhotoOrientation;
    typedef enum VideoOrientation VideoOrientation;

    interface IBasicProperties;
    interface IDocumentProperties;
    interface IImageProperties;
    interface IMusicProperties;
    interface IStorageItemExtraProperties;
    interface IStorageItemContentProperties;
    interface IVideoProperties;

    runtimeclass BasicProperties;
    runtimeclass DocumentProperties;
    runtimeclass ImageProperties;
    runtimeclass MusicProperties;
    runtimeclass StorageItemContentProperties;
    runtimeclass VideoProperties;

    declare {
        interface Windows.Foundation.Collections.IMap<HSTRING, IInspectable *>;
        interface Windows.Foundation.AsyncOperationCompletedHandler<Windows.Foundation.Collections.IMap<HSTRING, IInspectable *> *>;
        interface Windows.Foundation.AsyncOperationCompletedHandler<Windows.Storage.FileProperties.BasicProperties *>;
        interface Windows.Foundation.AsyncOperationCompletedHandler<Windows.Storage.FileProperties.DocumentProperties *>;
        interface Windows.Foundation.AsyncOperationCompletedHandler<Windows.Storage.FileProperties.ImageProperties *>;
        interface Windows.Foundation.AsyncOperationCompletedHandler<Windows.Storage.FileProperties.MusicProperties *>;
        interface Windows.Foundation.AsyncOperationCompletedHandler<Windows.Storage.FileProperties.VideoProperties *>;
        interface Windows.Foundation.Collections.IIterable<HSTRING>;
        interface Windows.Foundation.IAsyncOperation<Windows.Foundation.Collections.IMap<HSTRING, IInspectable *> *>;
        interface Windows.Foundation.IAsyncOperation<Windows.Storage.FileProperties.BasicProperties *>;
        interface Windows.Foundation.IAsyncOperation<Windows.Storage.FileProperties.DocumentProperties *>;
        interface Windows.Foundation.IAsyncOperation<Windows.Storage.FileProperties.ImageProperties *>;
        interface Windows.Foundation.IAsyncOperation<Windows.Storage.FileProperties.MusicProperties *>;
        interface Windows.Foundation.IAsyncOperation<Windows.Storage.FileProperties.VideoProperties *>;
    }

    [
        contract(Windows.Foundation.UniversalApiContract, 1.0)
    ]
    enum PhotoOrientation
    {
        Unspecified    = 0,
        Normal         = 1,
        FlipHorizontal = 2,
        Rotate180      = 3,
        FlipVertical   = 4,
        Transpose      = 5,
        Rotate270      = 6,
        Transverse     = 7,
        Rotate90       = 8
    };

    [
        contract(Windows.Foundation.UniversalApiContract, 1.0)
    ]
    enum VideoOrientation
    {
        Normal    = 0,
        Rotate90  = 90,
        Rotate180 = 180,
        Rotate270 = 270
    };

    [
        contract(Windows.Foundation.UniversalApiContract, 1.0),
        exclusiveto(Windows.Storage.FileProperties.BasicProperties),
        uuid(d05d55db-785e-4a66-be02-9beec58aea81)
    ]
    interface IBasicProperties : IInspectable
    {
        [propget] HRESULT Size([out, retval] UINT64 *value);
        [propget] HRESULT DateModified([out, retval] Windows.Foundation.DateTime *value);
        [propget] HRESULT ItemDate([out, retval] Windows.Foundation.DateTime *value);
    }

    [
        contract(Windows.Foundation.UniversalApiContract, 1.0),
        exclusiveto(Windows.Storage.FileProperties.DocumentProperties),
        uuid(7eab19bc-1821-4923-b4a9-0aea404d0070)
    ]
    interface IDocumentProperties : IInspectable
        requires Windows.Storage.FileProperties.IStorageItemExtraProperties
    {
        [propget] HRESULT Author([out, retval] Windows.Foundation.Collections.IVector<HSTRING> **value);
        [propget] HRESULT Title([out, retval] HSTRING *value);
        [propput] HRESULT Title([in] HSTRING value);
        [propget] HRESULT Keywords([out, retval] Windows.Foundation.Collections.IVector<HSTRING> **value);
        [propget] HRESULT Comment([out, retval] HSTRING *value);
        [propput] HRESULT Comment([in] HSTRING value);
    }

    [
        contract(Windows.Foundation.UniversalApiContract, 1.0),
        exclusiveto(Windows.Storage.FileProperties.ImageProperties),
        uuid(523c9424-fcff-4275-afee-ecdb9ab47973)
    ]
    interface IImageProperties : IInspectable
        requires Windows.Storage.FileProperties.IStorageItemExtraProperties
    {
        [propget] HRESULT Rating([out, retval] UINT32 *value);
        [propput] HRESULT Rating([in] UINT32 value);
        [propget] HRESULT Keywords([out, retval] Windows.Foundation.Collections.IVector<HSTRING> **value);
        [propget] HRESULT DateTaken([out, retval] Windows.Foundation.DateTime *value);
        [propput] HRESULT DateTaken([in] Windows.Foundation.DateTime value);
        [propget] HRESULT Width([out, retval] UINT32 *value);
        [propget] HRESULT Height([out, retval] UINT32 *value);
        [propget] HRESULT Title([out, retval] HSTRING *value);
        [propput] HRESULT Title([in] HSTRING value);
        [propget] HRESULT Latitude([out, retval] Windows.Foundation.IReference<DOUBLE> **value);
        [propget] HRESULT Longitude([out, retval] Windows.Foundation.IReference<DOUBLE> **value);
        [propget] HRESULT CameraManufacturer([out, retval] HSTRING *value);
        [propput] HRESULT CameraManufacturer([in] HSTRING value);
        [propget] HRESULT CameraModel([out, retval] HSTRING *value);
        [propput] HRESULT CameraModel([in] HSTRING value);
        [propget] HRESULT Orientation([out, retval] Windows.Storage.FileProperties.PhotoOrientation *value);
        [propget] HRESULT PeopleNames([out, retval] Windows.Foundation.Collections.IVectorView<HSTRING> **value);
    }

    [
        contract(Windows.Foundation.UniversalApiContract, 1.0),
        exclusiveto(Windows.Storage.FileProperties.MusicProperties),
        uuid(bc8aab62-66ec-419a-bc5d-ca65a4cb46da)
    ]
    interface IMusicProperties : IInspectable
        requires Windows.Storage.FileProperties.IStorageItemExtraProperties
    {
        [propget] HRESULT Album([out, retval] HSTRING *value);
        [propput] HRESULT Album([in] HSTRING value);
        [propget] HRESULT Artist([out, retval] HSTRING *value);
        [propput] HRESULT Artist([in] HSTRING value);
        [propget] HRESULT Genre([out, retval] Windows.Foundation.Collections.IVector<HSTRING> **value);
        [propget] HRESULT TrackNumber([out, retval] UINT32 *value);
        [propput] HRESULT TrackNumber([in] UINT32 value);
        [propget] HRESULT Title([out, retval] HSTRING *value);
        [propput] HRESULT Title([in] HSTRING value);
        [propget] HRESULT Rating([out, retval] UINT32 *value);
        [propput] HRESULT Rating([in] UINT32 value);
        [propget] HRESULT Duration([out, retval] Windows.Foundation.TimeSpan *value);
        [propget] HRESULT Bitrate([out, retval] UINT32 *value);
        [propget] HRESULT AlbumArtist([out, retval] HSTRING *value);
        [propput] HRESULT AlbumArtist([in] HSTRING value);
        [propget] HRESULT Composers([out, retval] Windows.Foundation.Collections.IVector<HSTRING> **value);
        [propget] HRESULT Conductors([out, retval] Windows.Foundation.Collections.IVector<HSTRING> **value);
        [propget] HRESULT Subtitle([out, retval] HSTRING *value);
        [propput] HRESULT Subtitle([in] HSTRING value);
        [propget] HRESULT Producers([out, retval] Windows.Foundation.Collections.IVector<HSTRING> **value);
        [propget] HRESULT Publisher([out] [retval] HSTRING *value);
        [propput] HRESULT Publisher([in] HSTRING value);
        [propget] HRESULT Writers([out, retval] Windows.Foundation.Collections.IVector<HSTRING> **value);
        [propget] HRESULT Year([out, retval] UINT32 *value);
        [propput] HRESULT Year([in] UINT32 value);
    }

    [
        contract(Windows.Foundation.UniversalApiContract, 1.0),
        uuid(c54361b2-54cd-432b-bdbc-4b19c4b470d7)
    ]
    interface IStorageItemExtraProperties : IInspectable
    {
        HRESULT RetrievePropertiesAsync(
            [in] Windows.Foundation.Collections.IIterable<HSTRING> *propertiesToRetrieve,
            [out, retval] Windows.Foundation.IAsyncOperation<Windows.Foundation.Collections.IMap<HSTRING, IInspectable *> *> **operation);
        [overload("SavePropertiesAsync")]
        HRESULT SavePropertiesAsync(
            [in] Windows.Foundation.Collections.IIterable<Windows.Foundation.Collections.IKeyValuePair<HSTRING, IInspectable *> *> *propertiesToSave,
            [out, retval] Windows.Foundation.IAsyncAction **operation);
        [overload("SavePropertiesAsync")]
        HRESULT SavePropertiesAsyncOverloadDefault(
            [out, retval] Windows.Foundation.IAsyncAction **operation);
    }

    [
        contract(Windows.Foundation.UniversalApiContract, 1.0),
        exclusiveto(Windows.Storage.FileProperties.StorageItemContentProperties),
        uuid(05294bad-bc38-48bf-85d7-770e0e2ae0ba)
    ]
    interface IStorageItemContentProperties : IInspectable
        requires Windows.Storage.FileProperties.IStorageItemExtraProperties
    {
        HRESULT GetMusicPropertiesAsync(
            [out, retval] Windows.Foundation.IAsyncOperation<Windows.Storage.FileProperties.MusicProperties *> **operation);
        HRESULT GetVideoPropertiesAsync(
            [out, retval] Windows.Foundation.IAsyncOperation<Windows.Storage.FileProperties.VideoProperties *> **operation);
        HRESULT GetImagePropertiesAsync(
            [out, retval] Windows.Foundation.IAsyncOperation<Windows.Storage.FileProperties.ImageProperties *> **operation);
        HRESULT GetDocumentPropertiesAsync(
            [out, retval] Windows.Foundation.IAsyncOperation<Windows.Storage.FileProperties.DocumentProperties *> **operation);
    }

    [
        contract(Windows.Foundation.UniversalApiContract, 1.0),
        exclusiveto(Windows.Storage.FileProperties.VideoProperties),
        uuid(719ae507-68de-4db8-97de-49998c059f2f)
    ]
    interface IVideoProperties : IInspectable
        requires Windows.Storage.FileProperties.IStorageItemExtraProperties
    {
        [propget] HRESULT Rating([out, retval] UINT32 *value);
        [propput] HRESULT Rating([in] UINT32 value);
        [propget] HRESULT Keywords([out, retval] Windows.Foundation.Collections.IVector<HSTRING> **value);
        [propget] HRESULT Width([out, retval] UINT32 *value);
        [propget] HRESULT Height([out, retval] UINT32 *value);
        [propget] HRESULT Duration([out, retval] Windows.Foundation.TimeSpan *value);
        [propget] HRESULT Latitude([out, retval] Windows.Foundation.IReference<DOUBLE> **value);
        [propget] HRESULT Longitude([out, retval] Windows.Foundation.IReference<DOUBLE> **value);
        [propget] HRESULT Title([out, retval] HSTRING *value);
        [propput] HRESULT Title([in] HSTRING value);
        [propget] HRESULT Subtitle([out, retval] HSTRING *value);
        [propput] HRESULT Subtitle([in] HSTRING value);
        [propget] HRESULT Producers([out, retval] Windows.Foundation.Collections.IVector<HSTRING> **value);
        [propget] HRESULT Publisher([out, retval] HSTRING *value);
        [propput] HRESULT Publisher([in] HSTRING value);
        [propget] HRESULT Writers([out, retval] Windows.Foundation.Collections.IVector<HSTRING> **value);
        [propget] HRESULT Year([out, retval] UINT32 *value);
        [propput] HRESULT Year([in] UINT32 value);
        [propget] HRESULT Bitrate([out, retval] UINT32 *value);
        [propget] HRESULT Directors([out, retval] Windows.Foundation.Collections.IVector<HSTRING> **value);
        [propget] HRESULT Orientation([out, retval] Windows.Storage.FileProperties.VideoOrientation *value);
    }

    [
        contract(Windows.Foundation.UniversalApiContract, 1.0)
    ]
    runtimeclass BasicProperties
    {
        [default] interface Windows.Storage.FileProperties.IBasicProperties;
        interface Windows.Storage.FileProperties.IStorageItemExtraProperties;
    }

    [
        contract(Windows.Foundation.UniversalApiContract, 1.0)
    ]
    runtimeclass DocumentProperties
    {
        [default] interface Windows.Storage.FileProperties.IDocumentProperties;
        interface Windows.Storage.FileProperties.IStorageItemExtraProperties;
    }

    [
        contract(Windows.Foundation.UniversalApiContract, 1.0)
    ]
    runtimeclass ImageProperties
    {
        [default] interface Windows.Storage.FileProperties.IImageProperties;
        interface Windows.Storage.FileProperties.IStorageItemExtraProperties;
    }

    [
        contract(Windows.Foundation.UniversalApiContract, 1.0)
    ]
    runtimeclass MusicProperties
    {
        [default] interface Windows.Storage.FileProperties.IMusicProperties;
        interface Windows.Storage.FileProperties.IStorageItemExtraProperties;
    }

    [
        contract(Windows.Foundation.UniversalApiContract, 1.0)
    ]
    runtimeclass StorageItemContentProperties
    {
        [default] interface Windows.Storage.FileProperties.IStorageItemContentProperties;
        interface Windows.Storage.FileProperties.IStorageItemExtraProperties;
    }

    [
        contract(Windows.Foundation.UniversalApiContract, 1.0)
    ]
    runtimeclass VideoProperties
    {
        [default] interface Windows.Storage.FileProperties.IVideoProperties;
        interface Windows.Storage.FileProperties.IStorageItemExtraProperties;
    }
}
