package plugin

import (
	"github.com/tidbcloud/infra-provider/pkg/config"

	cloudv1 "github.com/tidbcloud/infra-api/api/v1"
)

const (
	defaultAccountPluginName = "DefaultAccount"
	defaultAcctAnno          = "account.cloud.pingcap.com/is-default"
)

var (
	_ ScorePlugin = &defaultAccount{}
)

// defaultAccount always use the default account if it is feasible for a network.
type defaultAccount struct {
}

func newDefaultAccount(cfg config.AcctSchedPluginConfig) (Plugin, error) {
	return &defaultAccount{}, nil
}

func (p *defaultAccount) Name() string {
	return defaultAccountPluginName
}

func (p *defaultAccount) Score(sctx *SchedContext, network *cloudv1.Network, accts []*cloudv1.Account) ([]AcctScore, *ActionResult) {
	scores := make([]AcctScore, len(accts))
	for i, acct := range accts {
		score := AcctScore{
			AccountName: acct.Name,
			Score:       0,
		}
		if p.isDefaultAccount(acct) {
			score.Score = 100
		}
		scores[i] = score
	}
	return scores, NewActionResult(Success)
}

func (p *defaultAccount) isDefaultAccount(acct *cloudv1.Account) bool {
	defaultAcctAnno, exist := acct.Annotations[defaultAcctAnno]
	if exist && defaultAcctAnno == "true" {
		return true
	}

	return false
}
