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

using System.Runtime.CompilerServices;
using Microsoft.Win32;

namespace Windows.Win32;

internal static partial class PInvoke
{
    /// <inheritdoc cref="RegLoadMUIString(System.Registry.HKEY, PCWSTR, PWSTR, uint, uint*, uint, PCWSTR)"/>
    [SkipLocalsInit]
    public static unsafe bool RegLoadMUIString(RegistryKey key, string keyName, out string localizedValue)
    {
        using BufferScope<char> buffer = new(stackalloc char[128]);

        while (true)
        {
            fixed (char* pszOutBuf = buffer)
            fixed (char* pszKeyName = keyName)
            {
                uint bytes = 0;
                var errorCode = RegLoadMUIString(
                    (System.Registry.HKEY)key.Handle.DangerousGetHandle(),
                    pszKeyName,
                    pszOutBuf,
                    (uint)(buffer.Length * sizeof(char)),
                    &bytes,
                    0,
                    null);

                // The buffer is too small. Try again with a larger buffer.
                if (errorCode == WIN32_ERROR.ERROR_MORE_DATA)
                {
                    buffer.EnsureCapacity((int)(bytes / sizeof(char)));
                    continue;
                }

                localizedValue = errorCode == WIN32_ERROR.ERROR_SUCCESS
                    ? buffer[..Math.Max((int)(bytes / sizeof(char)) - 1, 0)].ToString()
                    : string.Empty;

                return errorCode == WIN32_ERROR.ERROR_SUCCESS;
            }
        }
    }
}
