package clauses

import "github.com/MontFerret/ferret/pkg/runtime/core"

type (
	CollectSelector struct {
		variable   string
		expression core.Expression
	}

	CollectAggregateSelector struct {
		variable    string
		aggregators []core.Expression
		reducer     core.Function
	}
)

func NewCollectSelector(variable string, exp core.Expression) (*CollectSelector, error) {
	if variable == "" {
		return nil, core.Error(core.ErrMissedArgument, "selector variable")
	}

	if exp == nil {
		return nil, core.Error(core.ErrMissedArgument, "selector reducer")
	}

	return &CollectSelector{variable, exp}, nil
}

func (selector *CollectSelector) Variable() string {
	return selector.variable
}

func (selector *CollectSelector) Expression() core.Expression {
	return selector.expression
}

func NewCollectAggregateSelector(variable string, aggr []core.Expression, reducer core.Function) (*CollectAggregateSelector, error) {
	if variable == "" {
		return nil, core.Error(core.ErrMissedArgument, "selector variable")
	}

	if reducer == nil {
		return nil, core.Error(core.ErrMissedArgument, "selector reducer")
	}

	if aggr == nil {
		return nil, core.Error(core.ErrMissedArgument, "selector aggregators")
	}

	return &CollectAggregateSelector{variable, aggr, reducer}, nil
}

func (selector *CollectAggregateSelector) Variable() string {
	return selector.variable
}

func (selector *CollectAggregateSelector) Expression() core.Function {
	return selector.reducer
}

func (selector *CollectAggregateSelector) Aggregators() []core.Expression {
	return selector.aggregators
}