package entity

var (
	CreatingClusterStatus         []ClusterStatus       = []ClusterStatus{ClusterStatusInitializing, ClusterStatusPreparing, ClusterStatusLaunching}
	DeletedClusterStatus          []ClusterStatus       = []ClusterStatus{ClusterStatusDeleted, ClusterStatusDeletecomplete}
	DeletedOrClearedClusterStatus []ClusterStatus       = []ClusterStatus{ClusterStatusDeleted, ClusterStatusDeletecomplete, ClusterStatusCleared}
	ReadyForBackupClusterStatus   []ClusterStatus       = []ClusterStatus{ClusterStatusNormal}
	ValidUserRoles                map[UserRole]struct{} = map[UserRole]struct{}{UserRoleOwner: {}, UserRoleMember: {}, UserRoleBillingAdmin: {}, UserRoleAuditAdmin: {}}

	DeletedCdcStatus  []CDCStatus = []CDCStatus{CDCStatusDeleted}
	CreatingCdcStatus []CDCStatus = []CDCStatus{CDCStatusCreating}
)

// Creating returns true if we are still creating the cluster
func (s ClusterStatus) Creating() bool {
	for _, tmp := range CreatingClusterStatus {
		if s == tmp {
			return true
		}
	}
	return false
}

// Deleted returns true if cluster is deleted
func (s ClusterStatus) Deleted() bool {
	for _, tmp := range DeletedClusterStatus {
		if s == tmp {
			return true
		}
	}
	return false
}

// DeletedOrCleared returns true if cluster is deleted or cleared
func (s ClusterStatus) DeletedOrCleared() bool {
	for _, tmp := range DeletedOrClearedClusterStatus {
		if s == tmp {
			return true
		}
	}
	return false
}

// ReadyForBackup returns true is cluster is ready for backup
func (c Cluster) ReadyForBackup() bool {
	for _, tmp := range ReadyForBackupClusterStatus {
		if c.Status == tmp {
			return true
		}
	}
	if c.Status == ClusterStatusDeleted && c.FinalBackupBeforeDelete {
		return true
	}
	return false
}

// IsDevTier returns true if cluster is dev tier
func (c Cluster) IsDevTier() bool {
	// TODO(chenfei): It is NOT the best strategy to detect whether the cluster is dev tier.
	return c.Free
}

func (t Tenant) FreeTrial() bool {
	if t.Plan == TenantPlanNewUser || t.Plan == TenantPlanFreeTrial {
		return true
	}
	return false
}
