package kms

// KeyPurpose allows an application to specify the reason they need a key; this
// is used to select which DEK to return
type KeyPurpose uint

const (
	// KeyPurposeUnknown is the default, and indicates that a correct purpose
	// wasn't specified
	KeyPurposeUnknown KeyPurpose = iota

	// KeyPurposeDatabase is used for general encryption needs for most values
	// in the database, excluding the oplog
	KeyPurposeDatabase

	// KeyPurposeOplog is used for oplogs
	KeyPurposeOplog

	// KeyPurposeRecovery is used for recovery access
	KeyPurposeRecovery

	// KeyPurposeTokens is used for token encryption
	KeyPurposeTokens

	// KeyPurposeSessions is used as a base key to derive session-specific encryption keys
	KeyPurposeSessions
)

// String returns the key purpose cast as a string, just so it can be called as
// a function instead of direct casting elsewhere, yw
func (k KeyPurpose) String() string {
	switch k {
	case KeyPurposeDatabase:
		return "database"
	case KeyPurposeOplog:
		return "oplog"
	case KeyPurposeRecovery:
		return "recovery"
	case KeyPurposeTokens:
		return "tokens"
	case KeyPurposeSessions:
		return "sessions"
	default:
		return "unknown"
	}
}

// KeyType allows the kms repo to return a map[KeyType]Key which can be easily
// used without type casting.
type KeyType uint

const (
	KeyTypeUnknown KeyType = iota
	KeyTypeRootKey
	KeyTypeRootKeyVersion
	KeyTypeDatabaseKey
	KeyTypeDatabaseKeyVersion
	KeyTypeOplogKey
	KeyTypeOplogKeyVersion
	KeyTypeTokenKey
	KeyTypeTokenKeyVersion
	KeyTypeSessionKey
	KeyTypeSessionKeyVersion
)

// String returns the key type cast as a string, just so it can be called as
// a function instead of direct casting elsewhere, yw
func (k KeyType) String() string {
	switch k {
	case KeyTypeRootKey:
		return "rootKey"
	case KeyTypeRootKeyVersion:
		return "rootKeyVersion"
	case KeyTypeDatabaseKey:
		return "databaseKey"
	case KeyTypeDatabaseKeyVersion:
		return "databaseKeyVersion"
	case KeyTypeOplogKey:
		return "oplogKey"
	case KeyTypeOplogKeyVersion:
		return "oplogKeyVersion"
	case KeyTypeTokenKey:
		return "tokenKey"
	case KeyTypeTokenKeyVersion:
		return "tokenKeyVersion"
	case KeyTypeSessionKey:
		return "sessionKey"
	case KeyTypeSessionKeyVersion:
		return "sessionKeyVersion"

	default:
		return "unknown"
	}
}
