package entity

type (
	TargetType string
	ScopeType  string
)

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

	// RoleBinding scope types
	RoleBindingScopeInvalid ScopeType = ""
	RoleBindingScopeOrg     ScopeType = "ORG"
	RoleBindingScopeProject ScopeType = "PROJECT"
	RoleBindingScopeDataAPP ScopeType = "DATAAPP"
	RoleBindingScopeTiDB    ScopeType = "TIDB" // for next gen cluster
)

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

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(UserRoleBillingViewer):         RoleOrgBillingViewer,
	string(UserRoleAuditAdmin):            RoleOrgAuditAdmin,
	string(UserRoleOrgClusterCreator):     RoleOrgClusterCreator,
	string(UserRoleImpersonated):          RoleOrgImpersonated,
	string(UserRoleProjectOwner):          RoleProjectOwner,
	string(UserRoleProjectDev):            RoleProjectDev,
	string(UserRoleProjectReadOnly):       RoleProjectReadOnly,
	string(UserRoleProjectCtlPlaneViewer): RoleProjectCtlPlaneViewer,
	string(UserRoleClusterAdmin):          RoleClusterAdmin,
	string(UserRoleClusterViewer):         RoleClusterViewer,
	//string(UserRoleClusterOperator):            RoleClusterOperator,
	//string(UserRoleClusterDataAccessReadOnly):  RoleClusterDataAccessReadOnly,
	//string(UserRoleClusterDataAccessReadWrite): RoleClusterDataAccessReadWrite,
}

var decodeUserRoleFromRoleBindingRole = map[string]UserRole{
	RoleOrgOwner:              UserRoleOwner,
	RoleOrgMember:             UserRoleMember,
	RoleOrgBillingAdmin:       UserRoleBillingAdmin,
	RoleOrgBillingViewer:      UserRoleBillingViewer,
	RoleOrgAuditAdmin:         UserRoleAuditAdmin,
	RoleOrgClusterCreator:     UserRoleOrgClusterCreator,
	RoleOrgImpersonated:       UserRoleImpersonated,
	RoleProjectOwner:          UserRoleProjectOwner,
	RoleProjectDev:            UserRoleProjectDev,
	RoleProjectReadOnly:       UserRoleProjectReadOnly,
	RoleProjectCtlPlaneViewer: UserRoleProjectCtlPlaneViewer,
	RoleClusterAdmin:          UserRoleClusterAdmin,
	RoleClusterViewer:         UserRoleClusterViewer,
	//RoleClusterOperator:            UserRoleClusterOperator,
	//RoleClusterDataAccessReadOnly:  UserRoleClusterDataAccessReadOnly,
	//RoleClusterDataAccessReadWrite: UserRoleClusterDataAccessReadWrite,
}

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

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