// This file defines trivial policies used as lower bounds for suite acceptance metrics.
package evaluation

import (
	decisionmetrics "github.com/tidbcloud/cluster-service-ng/internal/capacity-planner/pkg/metrics"
	productionpolicy "github.com/tidbcloud/cluster-service-ng/internal/capacity-planner/pkg/policy"
	"github.com/tidbcloud/cluster-service-ng/internal/capacity-planner/pkg/tier"
)

type replicaDeltaPolicy struct {
	tier  tier.Tier
	delta int32
}

var _ productionpolicy.Policy = (*replicaDeltaPolicy)(nil)

func (p *replicaDeltaPolicy) Choose(metrics []decisionmetrics.Metrics) (tier.Tier, int32, error) {
	var currentReplicas int32
	for i := range metrics {
		if replicas := int32(len(metrics[i].Series)); replicas > currentReplicas {
			currentReplicas = replicas
		}
	}

	return p.tier, currentReplicas + p.delta, nil
}

// AlwaysNoScale establishes the rejection-rate bound from Pod series cardinality.
func AlwaysNoScale(targetTier tier.Tier) productionpolicy.Policy {
	return &replicaDeltaPolicy{tier: targetTier}
}

// AlwaysScaleOut establishes the recall bound by adding one observed replica.
func AlwaysScaleOut(targetTier tier.Tier) productionpolicy.Policy {
	return &replicaDeltaPolicy{tier: targetTier, delta: 1}
}
