package entity

// CRRFSettingStatus represents the lifecycle state of a CRRF configuration.
type CRRFSettingStatus string

const (
	CRRFSettingStatusDisabled  CRRFSettingStatus = "disabled"
	CRRFSettingStatusEnabling  CRRFSettingStatus = "enabling"
	CRRFSettingStatusEnabled   CRRFSettingStatus = "enabled"
	CRRFSettingStatusDisabling CRRFSettingStatus = "disabling"
	CRRFSettingStatusFailed    CRRFSettingStatus = "failed"
)

// CRRFSetting stores the Cross-Region Replication based Failover configuration for a cluster.
type CRRFSetting struct {
	Updatable
	SoftDelete
	Versioned
	ClusterID       ID                `gorm:"type:bigint(20) unsigned;not null;uniqueIndex"`
	ProjectID       ID                `gorm:"type:bigint(20) unsigned;not null;index"`
	TenantID        ID                `gorm:"type:bigint(20) unsigned;not null;index"`
	Status          CRRFSettingStatus `gorm:"type:varchar(32);not null;default:'disabled'"`
	MasterRegion    string            `gorm:"type:varchar(64);not null;default:''"`
	SecondaryRegion string            `gorm:"type:varchar(64);not null;default:''"`

	// Cached bucket IDs from BackupSetting.Bucket.Buckets after dual-region is ready.
	MasterBucketID    ID `gorm:"type:bigint(20) unsigned;default:0"`
	SecondaryBucketID ID `gorm:"type:bigint(20) unsigned;default:0"`

	// LogBackupID is the ID of the log backup used when CRRF was enabled.
	// Recorded in enable_pitr.RunAfter and cleared on disable.
	LogBackupID ID `gorm:"type:bigint(20) unsigned;default:0"`

	// Error tracking for enable workflow failures.
	ErrMsg *string `gorm:"type:text"`
}

func (CRRFSetting) TableName() string {
	return "crrf_settings"
}

// IsActive returns true when CRRF is in a transitional or active state.
func (s *CRRFSetting) IsActive() bool {
	if s == nil {
		return false
	}

	return s.Status == CRRFSettingStatusEnabling ||
		s.Status == CRRFSettingStatusEnabled ||
		s.Status == CRRFSettingStatusDisabling
}
