package rules

import (
	"context"
	"time"

	"go.signoz.io/signoz/pkg/query-service/utils/labels"
)

// A Rule encapsulates a vector expression which is evaluated at a specified
// interval and acted upon (currently used for alerting).
type Rule interface {
	ID() string
	Name() string
	Type() RuleType

	Labels() labels.BaseLabels
	Annotations() labels.BaseLabels
	Condition() *RuleCondition
	State() AlertState
	ActiveAlerts() []*Alert

	PreferredChannels() []string

	Eval(context.Context, time.Time, *Queriers) (interface{}, error)
	String() string
	// Query() string
	SetLastError(error)
	LastError() error
	SetHealth(RuleHealth)
	Health() RuleHealth
	SetEvaluationDuration(time.Duration)
	GetEvaluationDuration() time.Duration
	SetEvaluationTimestamp(time.Time)
	GetEvaluationTimestamp() time.Time

	SendAlerts(ctx context.Context, ts time.Time, resendDelay time.Duration, interval time.Duration, notifyFunc NotifyFunc)
}