//go:build darwin

package gpu

import "C"
import (
	"runtime"

	"github.com/pbnjay/memory"
)

// CheckVRAM returns the free VRAM in bytes on Linux machines with NVIDIA GPUs
func CheckVRAM() (int64, error) {
	if runtime.GOARCH == "amd64" {
		// gpu not supported, this may not be metal
		return 0, nil
	}

	// on macOS, there's already buffer for available vram (see below) so just return the total
	systemMemory := int64(memory.TotalMemory())

	// macOS limits how much memory is available to the GPU based on the amount of system memory
	// TODO: handle case where iogpu.wired_limit_mb is set to a higher value
	if systemMemory <= 36*1024*1024*1024 {
		systemMemory = systemMemory * 2 / 3
	} else {
		systemMemory = systemMemory * 3 / 4
	}

	return systemMemory, nil
}

func GetGPUInfo() GpuInfo {
	mem, _ := getCPUMem()
	if runtime.GOARCH == "amd64" {
		return GpuInfo{
			Library: "cpu",
			Variant: GetCPUVariant(),
			memInfo: mem,
		}
	}
	return GpuInfo{
		Library: "metal",
		memInfo: mem,
	}
}

func getCPUMem() (memInfo, error) {
	return memInfo{
		TotalMemory: 0,
		FreeMemory:  0,
		DeviceCount: 0,
	}, nil
}
