package resources

import (
	"cloud.o-forge.io/core/oc-lib/models/resources/resource_model"
	"cloud.o-forge.io/core/oc-lib/models/utils"
	"cloud.o-forge.io/core/oc-lib/tools"
)

type Container struct {
	Image   string            `json:"image,omitempty" bson:"image,omitempty"`     // Image is the container image
	Command string            `json:"command,omitempty" bson:"command,omitempty"` // Command is the container command
	Args    string            `json:"args,omitempty" bson:"args,omitempty"`       // Args is the container arguments
	Env     map[string]string `json:"env,omitempty" bson:"env,omitempty"`         // Env is the container environment variables
	Volumes map[string]string `json:"volumes,omitempty" bson:"volumes,omitempty"` // Volumes is the container volumes
}

type Expose struct {
	Port    int    `json:"port,omitempty" bson:"port,omitempty"`       // Port is the port
	Reverse string `json:"reverse,omitempty" bson:"reverse,omitempty"` // Reverse is the reverse
	PAT     int    `json:"pat,omitempty" bson:"pat,omitempty"`         // PAT is the PAT
}

/*
* ProcessingResource is a struct that represents a processing resource
* it defines the resource processing
 */
type ProcessingResource struct {
	resource_model.AbstractResource
	IsService    bool       `json:"is_service,omitempty" bson:"is_service,omitempty"`       // IsService is a flag that indicates if the processing is a service
	CPUs         []*CPU     `bson:"cpus,omitempty" json:"cp_us,omitempty"`                  // CPUs is the list of CPUs
	GPUs         []*GPU     `bson:"gpus,omitempty" json:"gp_us,omitempty"`                  // GPUs is the list of GPUs
	RAM          *RAM       `bson:"ram,omitempty" json:"ram,omitempty"`                     // RAM is the RAM
	Storage      uint       `bson:"storage,omitempty" json:"storage,omitempty"`             // Storage is the storage
	Parallel     bool       `bson:"parallel,omitempty" json:"parallel,omitempty"`           // Parallel is a flag that indicates if the processing is parallel
	ScalingModel uint       `bson:"scaling_model,omitempty" json:"scaling_model,omitempty"` // ScalingModel is the scaling model
	DiskIO       string     `bson:"disk_io,omitempty" json:"disk_io,omitempty"`             // DiskIO is the disk IO
	Container    *Container `bson:"container,omitempty" json:"container,omitempty"`         // Container is the container
	Expose       []Expose   `bson:"expose,omitempty" json:"expose,omitempty"`               // Expose is the execution
}

func (d *ProcessingResource) GetAccessor(peerID string, groups []string, caller *tools.HTTPCaller) utils.Accessor {
	return New[*ProcessingResource](tools.PROCESSING_RESOURCE, peerID, groups, caller, func() utils.DBObject { return &ProcessingResource{} }) // Create a new instance of the accessor
}
