package nvml

import (
	"golang.zabbix.com/sdk/errs"
)

// Go idiomatic error constants.
var (
	ErrSuccess            error
	ErrUninitialized      = errs.New("NVML error: NVML was not first initialized with nvmlInit()")
	ErrInvalidArgument    = errs.New("NVML error: A supplied argument is invalid")
	ErrNotSupported       = errs.New("NVML error: The requested operation is not available on target device")
	ErrNoPermission       = errs.New("NVML error: The current user does not have permission for operation")
	ErrAlreadyInitialized = errs.New("NVML error: Multiple initializations are now allowed through ref counting")
	ErrNotFound           = errs.New("NVML error: A query to find an object was unsuccessful")
	ErrInsufficientSize   = errs.New("NVML error: An input argument is not large enough")
	ErrInsufficientPower  = errs.New("NVML error: A device's external power cables are not properly attached")
	ErrDriverNotLoaded    = errs.New("NVML error: NVIDIA driver is not loaded")
	ErrTimeout            = errs.New("NVML error: User provided timeout passed")
	ErrIrqIssue           = errs.New("NVML error: NVIDIA Kernel detected an interrupt issue with a GPU")
	ErrLibraryNotFound    = errs.New("NVML error: NVML Shared Library couldn't be found or loaded")
	ErrFunctionNotFound   = errs.New("NVML error: Local version of NVML doesn't implement this function")
	ErrCorruptedInforom   = errs.New("NVML error: infoROM is corrupted")
	ErrGpuIsLost          = errs.New("NVML error: The GPU has fallen off the bus or has otherwise become inaccessible")
	ErrUnknown            = errs.New("NVML error: An internal driver error occurred")
)

// MapNVMLResultToError maps NVML error codes to Go error types.
//
//nolint:gocyclo,cyclop
func mapNVMLResultToError(code int) error {
	switch code {
	case 0:
		return ErrSuccess
	case 1:
		return ErrUninitialized
	case 2:
		return ErrInvalidArgument
	case 3:
		return ErrNotSupported
	case 4:
		return ErrNoPermission
	case 5:
		return ErrAlreadyInitialized
	case 6:
		return ErrNotFound
	case 7:
		return ErrInsufficientSize
	case 8:
		return ErrInsufficientPower
	case 9:
		return ErrDriverNotLoaded
	case 10:
		return ErrTimeout
	case 11:
		return ErrIrqIssue
	case 12:
		return ErrLibraryNotFound
	case 13:
		return ErrFunctionNotFound
	case 14:
		return ErrCorruptedInforom
	case 15:
		return ErrGpuIsLost
	case 999:
		return ErrUnknown
	default:
		return errs.Errorf("NVML error: Unknown error code %d", code)
	}
}