package eigentrustctrl

import (
	"context"
)

// IterationContext is a context of the i-th
// stage of iterative EigenTrust algorithm.
type IterationContext interface {
	context.Context

	// Epoch must return epoch number to select the values
	// for global trust calculation.
	Epoch() uint64

	// I must return the sequence number of the iteration.
	I() uint32

	// Last must return true if I() is the last iteration.
	Last() bool
}

// DaughtersTrustCalculator is an interface of entity
// responsible for calculating the global trust of
// daughter nodes in terms of EigenTrust algorithm.
type DaughtersTrustCalculator interface {
	// Calculate must perform the iteration step of the loop
	// for computing the global trust of all daughter
	// nodes and sending intermediate values
	// according to EigenTrust description
	// http://ilpubs.stanford.edu:8090/562/1/2002-56.pdf Ch.5.1.
	//
	// Execution should be interrupted if ctx.Last().
	Calculate(ctx IterationContext)
}

// IterationsProvider must provide information about numbers
// of iterations for algorithm.
type IterationsProvider interface {
	EigenTrustIterations() (uint64, error)
}
