package role

import "github.com/pingcap/dbaas/billing2/constant"

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{
	constant.UserRoleOwner:                 constant.RoleOrgOwner,
	constant.UserRoleMember:                constant.RoleOrgMember,
	constant.UserRoleBillingAdmin:          constant.RoleOrgBillingAdmin,
	constant.UserRoleAuditAdmin:            constant.RoleOrgAuditAdmin,
	constant.UserRoleImpersonated:          constant.RoleOrgImpersonated,
	constant.UserRoleProjectOwner:          constant.RoleProjectOwner,
	constant.UserRoleProjectDev:            constant.RoleProjectDev,
	constant.UserRoleProjectReadOnly:       constant.RoleProjectReadOnly,
	constant.UserRoleOrgBillingViewer:      constant.RoleOrgBillingingViewer,
	constant.UserRoleProjectCtlPlaneViewer: constant.RoleProjectCtlPlaneViewer,
}

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

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

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