package tseries

import (
	"context"
	"time"

	"github.com/tech/sendico/pkg/db/repository/builder"
	rdecoder "github.com/tech/sendico/pkg/db/repository/decoder"
	tspoint "github.com/tech/sendico/pkg/db/tseries/point"
)

// TimeSeries[T] abstracts a Mongo time-series “bucket” of documents of type T.
type TimeSeries interface {
	// Aggregate runs an aggregation pipeline on the time-series
	Aggregate(ctx context.Context, builder builder.Pipeline, decoder rdecoder.DecodingFunc) error
	// Insert adds a single point into the series.
	Insert(ctx context.Context, point tspoint.TimePoint) error
	// InsertMany adds multiple points in one bulk operation.
	InsertMany(ctx context.Context, points []tspoint.TimePoint) error

	// Query fetches all points whose timeField lies in [from, to).
	// The 'filter' param is an optional Mongo-style query on meta or other fields.
	Query(
		ctx context.Context,
		decoder rdecoder.DecodingFunc,
		filter builder.Query,
		from, to *time.Time,
	) error
}
