package api

import (
	"github.com/docker/docker/api/types/container"
)

const (
	MilliCore = 1_000_000
	Core      = 1000 * MilliCore
)

type ContainerResources struct {
	// CPU is the maximum amount of CPU nanocores (1000000000 = 1 CPU core) the container can use.
	CPU int64
	// Memory is the maximum amount of memory (in bytes) the container can use.
	Memory int64
	// MemoryReservation is the minimum amount of memory (in bytes) the container needs to run efficiently.
	// TODO: implement a placement constraint that checks available memory on machines.
	MemoryReservation int64
	// Devices provides direct access to host devices.
	Devices []DeviceMapping
	// DeviceReservations requests for access to things like GPUs.
	DeviceReservations []container.DeviceRequest
	// SharedMemory is the size of the shared memory (in bytes) mounted at /dev/shm in the container.
	SharedMemory int64
	// Ulimits defines the resource limits for the container.
	Ulimits map[string]Ulimit
}

// DeviceMapping represents a device mapping between host and container.
type DeviceMapping struct {
	// HostPath is the path to the device on the host.
	HostPath string
	// ContainerPath is the path to the device in the container.
	ContainerPath string
	// CgroupPermissions is the cgroup permissions for the device (e.g., "rwm").
	CgroupPermissions string
}

type Ulimit struct {
	Soft int64
	Hard int64
}
