package strategy

import (
	"errors"
	"gitlink.org.cn/JointCloud/pcm-coordinator/internal/scheduler/algorithm/weightDistributing"
)

type StaticWeightStrategy struct {
	staticWeightMap map[string]int32
	replicas        int32
}

func NewStaticWeightStrategy(staticWeightMap map[string]int32, replicas int32) *StaticWeightStrategy {
	return &StaticWeightStrategy{staticWeightMap: staticWeightMap,
		replicas: replicas,
	}
}

func (s *StaticWeightStrategy) Schedule() ([]*AssignedCluster, error) {

	if s.replicas < 1 {
		return nil, errors.New("replicas must be greater than 0")
	}

	if len(s.staticWeightMap) == 0 || s.staticWeightMap == nil {
		return nil, errors.New("weight must be set")
	}

	weights := make([]*weightDistributing.Weight, 0)
	for k, v := range s.staticWeightMap {
		weight := &weightDistributing.Weight{
			Id:     k,
			Weight: v,
		}
		weights = append(weights, weight)
	}

	err := weightDistributing.DistributeReplicas(weights, s.replicas)
	if err != nil {
		return nil, err
	}

	var results []*AssignedCluster
	for _, weight := range weights {
		cluster := &AssignedCluster{ClusterId: weight.Id, Replicas: weight.Replica}
		results = append(results, cluster)
	}

	return results, nil
}
