package constants

type VersionCode string

type ShareMode string

const (
	EXCLUSIVE ShareMode = "exclusive"
	SHARED    ShareMode = "shared"
	VIRTUAL   ShareMode = "virtual"
	ENHANCED  ShareMode = "enhanced"
)

type ObservabilityCategory string

const (
	LOGS          ObservabilityCategory = "logs"
	METRICS       ObservabilityCategory = "metrics"
	TRACE         ObservabilityCategory = "trace"
	PROFILING     ObservabilityCategory = "profiling"
	TOPSQL        ObservabilityCategory = "topsql"
	ALERTS        ObservabilityCategory = "alerts"
	KEYVISUALIZER ObservabilityCategory = "keyvisual"
	SLOWQUERYS    ObservabilityCategory = "slowquery"
	SQLSTATEMENTS ObservabilityCategory = "statements"
	DIAGNOSIS     ObservabilityCategory = "diagnosis"
)

func AllCategory() []ObservabilityCategory {
	// These are the storage-backed categories we expose through cluster metadata.
	return []ObservabilityCategory{
		LOGS,
		PROFILING,
		SLOWQUERYS,
		SQLSTATEMENTS,
	}
}

type ObservabilityCategoryStatus string

const ObservabilityCategoryEnabled ObservabilityCategoryStatus = "enabled"
const ObservabilityCategoryDisabled ObservabilityCategoryStatus = "disabled"

type DataPropertyRights int

const (
	CustomerTenant  DataPropertyRights = 0
	ServiceProvider DataPropertyRights = 1
)

type ResourceStatus string

func (rs ResourceStatus) ClusterHasBeenRequestedToPause() bool {
	switch rs {
	case TO_BE_PAUSED, PAUSING, PAUSED:
		return true
	}

	return false
}

func (rs ResourceStatus) ClusterHasBeenRequestedToResume() bool {
	switch rs {
	case RESUMING:
		return true
	}

	return false
}

func (rs ResourceStatus) ClusterHasBeenRequestedToDelete() bool {
	switch rs {
	case TO_BE_DELETED, DELETING:
		return true
	}

	return false
}

func (rs ResourceStatus) ClusterCanBeRequestedToPause() bool {
	switch rs {
	case ACTIVE, UPDATING:
		return true
	}

	return false
}

const (
	CREATING        ResourceStatus = "CREATING"
	ACTIVE          ResourceStatus = "ACTIVE"
	UPDATING        ResourceStatus = "UPDATING"
	DELETING        ResourceStatus = "DELETING"
	TO_BE_DELETED   ResourceStatus = "TO_BE_DELETED"
	CREATION_FAILED ResourceStatus = "CREATION_FAILED"
	TO_BE_PAUSED    ResourceStatus = "TO_BE_PAUSED"
	PAUSING         ResourceStatus = "PAUSING"
	PAUSED          ResourceStatus = "PAUSED"
	RESUMING        ResourceStatus = "RESUMING"
	COMPLETED       ResourceStatus = "COMPLETED"
	FAILED          ResourceStatus = "FAILED"
)

var ObservabilityNamespace = "observability"

func CanBeDeleted(status ResourceStatus) bool {
	if status == ACTIVE || status == CREATION_FAILED {
		return true
	}
	return false
}

const (
	UseRDSKey = "useRDS"
)
