package store

import "time"

// alertRule represents a record in alert_rule table
type alertRule struct {
	ID                   int64  `xorm:"pk autoincr 'id'"`
	GUID                 string `xorm:"guid"`
	OrgID                int64  `xorm:"org_id"`
	Title                string
	Condition            string
	Data                 string
	Updated              time.Time
	UpdatedBy            *string `xorm:"updated_by"`
	IntervalSeconds      int64
	Version              int64   `xorm:"version"` // this tag makes xorm add optimistic lock (see https://xorm.io/docs/chapter-06/1.lock/)
	UID                  string  `xorm:"uid"`
	NamespaceUID         string  `xorm:"namespace_uid"`
	DashboardUID         *string `xorm:"dashboard_uid"`
	PanelID              *int64  `xorm:"panel_id"`
	RuleGroup            string
	RuleGroupIndex       int `xorm:"rule_group_idx"`
	Record               string
	NoDataState          string
	ExecErrState         string
	For                  time.Duration
	Annotations          string
	Labels               string
	IsPaused             bool
	NotificationSettings string `xorm:"notification_settings"`
	Metadata             string `xorm:"metadata"`
}

func (a alertRule) TableName() string {
	return "alert_rule"
}

// alertRuleVersion represents a record in alert_rule_version table
type alertRuleVersion struct {
	ID               int64  `xorm:"pk autoincr 'id'"`
	RuleOrgID        int64  `xorm:"rule_org_id"`
	RuleGUID         string `xorm:"rule_guid"`
	RuleUID          string `xorm:"rule_uid"`
	RuleNamespaceUID string `xorm:"rule_namespace_uid"`
	RuleGroup        string
	RuleGroupIndex   int `xorm:"rule_group_idx"`
	ParentVersion    int64
	RestoredFrom     int64
	Version          int64

	Created         time.Time
	CreatedBy       *string `xorm:"created_by"`
	Title           string
	Condition       string
	Data            string
	IntervalSeconds int64
	Record          string
	NoDataState     string
	ExecErrState    string
	// ideally this field should have been apimodels.ApiDuration
	// but this is currently not possible because of circular dependencies
	For                  time.Duration
	Annotations          string
	Labels               string
	IsPaused             bool
	NotificationSettings string `xorm:"notification_settings"`
	Metadata             string `xorm:"metadata"`
}

// EqualSpec compares two alertRuleVersion objects for equality based on their specifications and returns true if they match.
// The comparison is very basic and can produce false-negative. Fields excluded: ID, ParentVersion, RestoredFrom, Version, Created and CreatedBy
func (a alertRuleVersion) EqualSpec(b alertRuleVersion) bool {
	return a.RuleOrgID == b.RuleOrgID &&
		a.RuleGUID == b.RuleGUID &&
		a.RuleUID == b.RuleUID &&
		a.RuleNamespaceUID == b.RuleNamespaceUID &&
		a.RuleGroup == b.RuleGroup &&
		a.RuleGroupIndex == b.RuleGroupIndex &&
		a.Title == b.Title &&
		a.Condition == b.Condition &&
		a.Data == b.Data &&
		a.IntervalSeconds == b.IntervalSeconds &&
		a.Record == b.Record &&
		a.NoDataState == b.NoDataState &&
		a.ExecErrState == b.ExecErrState &&
		a.For == b.For &&
		a.Annotations == b.Annotations &&
		a.Labels == b.Labels &&
		a.IsPaused == b.IsPaused &&
		a.NotificationSettings == b.NotificationSettings &&
		a.Metadata == b.Metadata
}

func (a alertRuleVersion) TableName() string {
	return "alert_rule_version"
}
