// Licensed to the .NET Foundation under one or more agreements.
// The .NET Foundation licenses this file to you under the MIT license.

using System.Drawing;
using Windows.Win32.System.Ole;
using Windows.Win32.System.Variant;

namespace Windows.Win32.System.Com.Tests;

[Collection("Sequential")]
public partial class IDispatchTests
{
    [StaFact]
    public unsafe void IDispatch_GetIDsOfNames_Invoke_Success()
    {
        using Bitmap image = new(16, 32);
        using var picture = IPictureDisp.CreateFromImage(image);
        Assert.False(picture.IsNull);

        Guid riid = Guid.Empty;
        fixed (char* width = "Width")
        fixed (char* other = "Other")
        {
            var rgszNames = new PWSTR[] { width, other };
            int[] rgDispId = new int[rgszNames.Length];
            fixed (int* pRgDispId = rgDispId)
            fixed (PWSTR* pRgszNames = rgszNames)
            {
                picture.Value->GetIDsOfNames(&riid, pRgszNames, (uint)rgszNames.Length, PInvokeCore.GetThreadLocale(), pRgDispId);
                Assert.Equal([width, other], rgszNames);

                Assert.Equal(new int[] { (int)PInvokeCore.DISPID_PICT_WIDTH, PInvokeCore.DISPID_UNKNOWN }, rgDispId);
            }
        }
    }

    [StaFact]
    public unsafe void IDispatch_GetTypeInfo_Invoke_Success()
    {
        using Bitmap image = new(16, 16);
        using var picture = IPictureDisp.CreateFromImage(image);
        Assert.False(picture.IsNull);

        using ComScope<ITypeInfo> typeInfo = new(null);
        picture.Value->GetTypeInfo(0, PInvokeCore.GetThreadLocale(), typeInfo);
    }

    [StaFact]
    public unsafe void IDispatch_GetTypeInfoCount_Invoke_Success()
    {
        using Bitmap image = new(16, 16);
        using var picture = IPictureDisp.CreateFromImage(image);
        Assert.False(picture.IsNull);

        uint ctInfo = uint.MaxValue;
        picture.Value->GetTypeInfoCount(&ctInfo);
        Assert.Equal(1u, ctInfo);
    }

    [StaFact]
    public unsafe void IDispatch_Invoke_Invoke_Success()
    {
        using Bitmap image = new(16, 32);
        using var picture = IPictureDisp.CreateFromImage(image);
        Assert.False(picture.IsNull);

        using VARIANT varResult = default;
        HRESULT hr = ((IDispatch*)picture.Value)->TryGetProperty(
            PInvokeCore.DISPID_PICT_WIDTH,
            &varResult,
            PInvokeCore.GetThreadLocale());
        Assert.Equal(HRESULT.S_OK, hr);
        Assert.Equal(VARENUM.VT_I4, varResult.vt);
        Assert.Equal(16, GdiHelper.HimetricToPixelY(varResult.data.intVal));
    }
}
