// Package aggregation contains implementations of bitlist aggregation algorithms and heuristics.
package aggregation

import (
	"errors"
	"fmt"

	"github.com/prysmaticlabs/go-bitfield"
	"github.com/sirupsen/logrus"
)

var log = logrus.WithField("prefix", "aggregation")

var (
	// ErrBitsOverlap is returned when two bitlists overlap with each other.
	ErrBitsOverlap = errors.New("overlapping aggregation bits")

	// ErrBitsDifferentLen is returned when two bitlists have different lengths.
	ErrBitsDifferentLen = errors.New("different bitlist lengths")

	// ErrInvalidStrategy is returned when invalid aggregation strategy is selected.
	ErrInvalidStrategy = errors.New("invalid aggregation strategy")
)

// Aggregation defines the bitlist aggregation problem solution.
type Aggregation struct {
	// Coverage represents the best available solution to bitlist aggregation.
	Coverage bitfield.Bitlist
	// Keys is a list of candidate keys in the best available solution.
	Keys []int
}

// String provides string representation of a solution.
func (ag *Aggregation) String() string {
	return fmt.Sprintf("{coverage: %#b, keys: %v}", ag.Coverage, ag.Keys)
}
