package fpc

import "time"

// Parameters define the parameters of an FPC instance.
type Parameters struct {
	// The lower bound liked percentage threshold at the first round. Also called 'a'.
	FirstRoundLowerBoundThreshold float64
	// The upper bound liked percentage threshold at the first round. Also called 'b'.
	FirstRoundUpperBoundThreshold float64
	// The lower bound liked percentage threshold used after the first round.
	SubsequentRoundsLowerBoundThreshold float64
	// The upper bound liked percentage threshold used after the first round.
	SubsequentRoundsUpperBoundThreshold float64
	// The amount of opinions to query on each round for a given vote context. Also called 'k'.
	QuerySampleSize int
	// The amount of rounds a vote context's opinion needs to stay the same to be considered final. Also called 'l'.
	FinalizationThreshold int
	// The amount of rounds for which to ignore any finalization checks for. Also called 'm'.
	CoolingOffPeriod int
	// The max amount of rounds to execute per vote context before aborting them.
	MaxRoundsPerVoteContext int
	// The max amount of time a query is allowed to take.
	QueryTimeout time.Duration
}

// DefaultParameters returns the default parameters used in FPC.
func DefaultParameters() *Parameters {
	return &Parameters{
		FirstRoundLowerBoundThreshold:       0.67,
		FirstRoundUpperBoundThreshold:       0.67,
		SubsequentRoundsLowerBoundThreshold: 0.50,
		SubsequentRoundsUpperBoundThreshold: 0.67,
		QuerySampleSize:                     21,
		FinalizationThreshold:               10,
		CoolingOffPeriod:                    0,
		MaxRoundsPerVoteContext:             100,
		QueryTimeout:                        1500 * time.Millisecond,
	}
}

// RandUniformThreshold returns random threshold between the given lower/upper bound values.
func RandUniformThreshold(rand float64, thresholdLowerBound float64, thresholdUpperBound float64) float64 {
	return thresholdLowerBound + rand*(thresholdUpperBound-thresholdLowerBound)
}