using System.Reflection;
using System.Runtime.InteropServices;

namespace Bit.RustSDK;

public static partial class NativeMethods
{
    // https://docs.microsoft.com/en-us/dotnet/standard/native-interop/cross-platform
    // Library path will search
    // win => __DllName, __DllName.dll
    // linux, osx => __DllName.so, __DllName.dylib

    static NativeMethods()
    {
        NativeLibrary.SetDllImportResolver(typeof(NativeMethods).Assembly, DllImportResolver);
    }

    static IntPtr DllImportResolver(string libraryName, Assembly assembly, DllImportSearchPath? searchPath)
    {
        if (libraryName != __DllName) return IntPtr.Zero;

        var path = "runtimes/";
        var extension = "";

        if (RuntimeInformation.IsOSPlatform(OSPlatform.Windows))
        {
            path += "win-";
            extension = ".dll";
        }
        else if (RuntimeInformation.IsOSPlatform(OSPlatform.OSX))
        {
            path += "osx-";
            extension = ".dylib";
        }
        else
        {
            path += "linux-";
            extension = ".so";
        }

        if (RuntimeInformation.ProcessArchitecture == Architecture.X86)
        {
            path += "x86";
        }
        else if (RuntimeInformation.ProcessArchitecture == Architecture.X64)
        {
            path += "x64";
        }
        else if (RuntimeInformation.ProcessArchitecture == Architecture.Arm64)
        {
            path += "arm64";
        }

        path += "/native/" + __DllName + extension;

        return NativeLibrary.Load(Path.Combine(AppContext.BaseDirectory, path), assembly, searchPath);
    }
}
