package standalone

import (
	"context"

	"github.com/shirou/gopsutil/host"
	"github.com/yusufpapurcu/wmi"
	"go.skia.org/infra/go/skerr"
	"go.skia.org/infra/machine/go/test_machine_monitor/standalone/crossplatform"
	"go.skia.org/infra/machine/go/test_machine_monitor/standalone/windows"
)

func OSVersions(ctx context.Context) ([]string, error) {
	platform, _, version, err := host.PlatformInformationWithContext(ctx)
	// Return values are like these:
	// "Microsoft Windows Server 2019 Datacenter", "Server", "10.0.17763 Build 17763"
	// "Microsoft Windows 10 Pro", "Standalone Workstation", "10.0.19043 Build 19043"

	if err != nil {
		return nil, skerr.Wrapf(err, "failed to get Windows version")
	}
	return windows.OSVersions(platform, version)
}

func CPUs(ctx context.Context) ([]string, error) {
	return crossplatform.CPUs("", "")
}

// GPUs returns Swarming-style dimensions representing all GPUs on the host. Each GPU may yield up
// to 3 returned elements: "vendorID", "vendorID:deviceID", and "vendorID:deviceID-driverVersion".
// If no GPUs are found or if the host is running within VMWare, returns ["none"].
func GPUs(ctx context.Context) ([]string, error) {
	var results []windows.GPUQueryResult
	err := wmi.Query("SELECT DriverVersion, PNPDeviceID FROM Win32_VideoController", &results)
	if err != nil {
		return nil, skerr.Wrapf(err, "failed to run WMI query to get GPU info")
	}
	return windows.GPUs(results), nil
}

// IsGCEMachine returns true if running on GCE.
func IsGCEMachine() bool {
	return crossplatform.IsGCEMachine()
}

// GCEMachineType returns the GCE machine type.
func GCEMachineType() (string, error) {
	return crossplatform.GCEMachineType()
}

// IsDockerInstalled returns true if Docker is installed.
func IsDockerInstalled(ctx context.Context) bool {
	return crossplatform.IsDockerInstalled(ctx)
}
