package datacenter

import (
	"encoding/json"

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

/*
* DatacenterResource is a struct that represents a datacenter resource
* it defines the resource datacenter
 */
type DatacenterResource struct {
	resource_model.AbstractResource
	CPUs []*CPU `bson:"cpus,omitempty" json:"cpus,omitempty"` // CPUs is the list of CPUs
	RAM  *RAM   `bson:"ram,omitempty" json:"ram,omitempty"`   // RAM is the RAM
	GPUs []*GPU `bson:"gpus,omitempty" json:"gpus,omitempty"` // GPUs is the list of GPUs
}

func (dma *DatacenterResource) Deserialize(j map[string]interface{}) utils.DBObject {
	b, err := json.Marshal(j)
	if err != nil {
		return nil
	}
	json.Unmarshal(b, dma)
	return dma
}

func (dma *DatacenterResource) Serialize() map[string]interface{} {
	var m map[string]interface{}
	b, err := json.Marshal(dma)
	if err != nil {
		return nil
	}
	json.Unmarshal(b, &m)
	return m
}

func (d *DatacenterResource) GetAccessor(caller *tools.HTTPCaller) utils.Accessor {
	data := New()
	data.Init(tools.DATACENTER_RESOURCE, caller)
	return data
}

// CPU is a struct that represents a CPU
type CPU struct {
	Cores         uint   `bson:"cores,omitempty" json:"cores,omitempty"`               //TODO: validate
	Architecture  string `bson:"architecture,omitempty" json:"architecture,omitempty"` //TOOD: enum
	Shared        bool   `bson:"shared,omitempty" json:"shared,omitempty"`
	MinimumMemory uint   `bson:"minimum_memory,omitempty" json:"minimum_memory,omitempty"`
	Platform      string `bson:"platform,omitempty" json:"platform,omitempty"`
}

type RAM struct {
	Size uint `bson:"size,omitempty" json:"size,omitempty" description:"Units in MB"`
	Ecc  bool `bson:"ecc,omitempty" json:"ecc,omitempty"`
}

type GPU struct {
	CudaCores   uint   `bson:"cuda_cores,omitempty" json:"cuda_cores,omitempty"`
	Model       string `bson:"model,omitempty" json:"model,omitempty"`
	Memory      uint   `bson:"memory,omitempty" json:"memory,omitempty" description:"Units in MB"`
	TensorCores uint   `bson:"tensor_cores,omitempty" json:"tensor_cores,omitempty"`
}