package rules

import (
	"context"
	"time"

	"github.com/SigNoz/signoz/pkg/query-service/model"
	"github.com/SigNoz/signoz/pkg/query-service/utils/labels"
	ruletypes "github.com/SigNoz/signoz/pkg/types/ruletypes"
)

// 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() ruletypes.RuleType

	Labels() labels.BaseLabels
	Annotations() labels.BaseLabels
	Condition() *ruletypes.RuleCondition
	EvalDelay() time.Duration
	EvalWindow() time.Duration
	HoldDuration() time.Duration
	State() model.AlertState
	ActiveAlerts() []*ruletypes.Alert

	PreferredChannels() []string

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

	RecordRuleStateHistory(ctx context.Context, prevState, currentState model.AlertState, itemsToAdd []model.RuleStateHistory) error

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