package schedulers

import (
	"gitlink.org.cn/JointCloud/pcm-coordinator/api/internal/scheduler/algorithm/providerPricing"
	"gitlink.org.cn/JointCloud/pcm-coordinator/api/internal/scheduler/database"
	"gitlink.org.cn/JointCloud/pcm-coordinator/api/internal/scheduler/strategy"
	"gitlink.org.cn/JointCloud/pcm-coordinator/api/internal/scheduler/strategy/param"
	"gitlink.org.cn/JointCloud/pcm-coordinator/api/pkg/response"
	"gitlink.org.cn/JointCloud/pcm-coordinator/pkg/constants"
	"gitlink.org.cn/JointCloud/pcm-coordinator/pkg/models"
	"gitlink.org.cn/JointCloud/pcm-coordinator/pkg/utils"
)

type VmScheduler struct {
	storage database.Storage
}

func NewVmScheduler() *VmScheduler {
	return &VmScheduler{}
}

func (vm *VmScheduler) PickOptimalStrategy() (strategy.Strategy, error) {
	//获取所有计算中心
	//调度算法
	strategy := strategy.NewPricingStrategy(&param.ResourcePricingParams{})
	return strategy, nil
}

func (v *VmScheduler) GetNewStructForDb(task *response.TaskInfo, resource string, participantId int64) (interface{}, error) {
	//TODO implement me
	vm := models.Vm{}
	utils.Convert(task.Metadata, &vm)
	vm.Id = utils.GenSnowflakeID()
	vm.TaskId = vm.TaskId
	vm.Status = constants.Saved
	vm.ParticipantId = participantId
	return vm, nil
	//vm.YamlString =v.yamlString
	/*	vm. = utils.GenSnowflakeID()
		vm.NsID = task.NsID
		vm.ParticipantId = participantId*/
}

/*
	func (vm *VmScheduler) UnMarshalVmStruct(yamlString string, taskId int64, nsID string) models.vm {
		var vm models.Vm
		vm := kyaml.NewYAMLOrJSONDecoder(bytes.NewBufferString(yamlString), 4096)
	}
*/
func (vm *VmScheduler) genTaskAndProviders() (*providerPricing.Task, []*providerPricing.Provider, error) {
	proParams, err := vm.storage.GetProviderParams()
	if err != nil {
		return nil, nil, nil
	}
	var providerList []*providerPricing.Provider
	for _, p := range proParams {
		provider := providerPricing.NewProvider(p.Participant_id, p.Cpu_avail, p.Mem_avail, p.Disk_avail, 0.0, 0.0, 0.0)
		providerList = append(providerList, provider)
	}

	//replicas := task.Metadata.(map[string]interface{})["spec"].(map[string]interface{})["replicas"].(float64)
	//t := algorithm.NewTask(0, int(replicas), 2, 75120000, 301214500, 1200, 2, 6, 2000)

	return nil, providerList, nil
}

func (v VmScheduler) AssignTask(clusters []*strategy.AssignedCluster) (interface{}, error) {
	//TODO implement me
	panic("implement me")
}
