package entity

type (
	TargetType string
	ScopeType  string
)

const (
	// RoleBinding target types
	RoleBindingTargetInvalid TargetType = ""
	RoleBindingTargetUser    TargetType = "USER"
	RoleBindingTargetAPIKey  TargetType = "APIKEY"

	// RoleBinding scope types
	RoleBindingScopeInvalid ScopeType = ""
	RoleBindingScopeOrg     ScopeType = "ORG"
	RoleBindingScopeProject ScopeType = "PROJECT"
	RoleBindingScopeDataAPP ScopeType = "DATAAPP"
)

var rbacScopeTypeEnum = map[string]ScopeType{
	"ORG":     RoleBindingScopeOrg,
	"PROJECT": RoleBindingScopeProject,
	"DATAAPP": RoleBindingScopeDataAPP,
}

var rbacTargetTypeEnum = map[string]TargetType{
	"USER":   RoleBindingTargetUser,
	"APIKEY": RoleBindingTargetAPIKey,
}

func ParseScopeType(scopeType string) ScopeType {
	if v, ok := rbacScopeTypeEnum[scopeType]; ok {
		return v
	}
	return RoleBindingScopeInvalid
}

func ParseTargetType(targetType string) TargetType {
	if v, ok := rbacTargetTypeEnum[targetType]; ok {
		return v
	}
	return RoleBindingTargetInvalid
}

func (t TargetType) String() string {
	return string(t)
}

func (t ScopeType) String() string {
	return string(t)
}

var encodeUserRoleToRoleBindingRole = map[string]string{
	string(UserRoleOwner):           RoleOrgOwner,
	string(UserRoleMember):          RoleOrgMember,
	string(UserRoleBillingAdmin):    RoleOrgBillingAdmin,
	string(UserRoleAuditAdmin):      RoleOrgAuditAdmin,
	string(UserRoleImpersonated):    RoleOrgImpersonated,
	string(UserRoleProjectOwner):    RoleProjectOwner,
	string(UserRoleProjectDev):      RoleProjectDev,
	string(UserRoleProjectReadOnly): RoleProjectReadOnly,
}

var decodeUserRoleFromRoleBindingRole = map[string]UserRole{
	RoleOrgOwner:        UserRoleOwner,
	RoleOrgMember:       UserRoleMember,
	RoleOrgBillingAdmin: UserRoleBillingAdmin,
	RoleOrgAuditAdmin:   UserRoleAuditAdmin,
	RoleOrgImpersonated: UserRoleImpersonated,
	RoleProjectOwner:    UserRoleProjectOwner,
	RoleProjectDev:      UserRoleProjectDev,
	RoleProjectReadOnly: UserRoleProjectReadOnly,
}

func UserRoleEncode(r string) string {
	return encodeUserRoleToRoleBindingRole[r]
}

func RoleBindingDecode(r string) UserRole {
	return decodeUserRoleFromRoleBindingRole[r]
}
