package test

import (
	"context"
	"fmt"
	"testing"

	"github.com/tidbcloud/tiinf/sdk/rbac/common"
	"github.com/tidbcloud/tiinf/sdk/rbac/helperimpl"
)

func TestTreedCascadeResource(t *testing.T) {
	root := &helperimpl.CascadeResourceTree{
		ResourceType: "orgs",
		MatchFunc: func(ctx context.Context, curResource, childResource string) (bool, error) {
			if curResource == "1" && childResource == "2" {
				return true, nil
			}
			return false, nil
		},
		ChildResource: &helperimpl.CascadeResourceTree{
			ResourceType: "projects",
			MatchFunc: func(ctx context.Context, curResource, childResource string) (bool, error) {
				if curResource == "2" && childResource == "3" {
					return true, nil
				}
				return false, nil
			},
			ChildResource: &helperimpl.CascadeResourceTree{
				ResourceType: "clusters",
				MatchFunc:    nil,
			},
		},
	}

	checker := helperimpl.NewTreedResourceCascadeChecker(root)
	resource, err := checker.CheckCascadeResource(context.Background(), &common.ResourceCascadeParam{
		ResourceUri: "orgs/1/projects/5/clusters/3/update",
	})
	fmt.Println(resource, err)
}

func TestMappedCascadeResource(t *testing.T) {
	var cascadeResourceMatchGroup = map[string]map[string]helperimpl.CascadeResourceMatchFunc{
		"orgs": {
			"projects": func(ctx context.Context, curResource, childResource string) (bool, error) {
				if curResource == "1" && childResource == "2" {
					return true, nil
				}
				return false, nil
			},
		},
		"projects": {
			"clusters": func(ctx context.Context, curResource, childResource string) (bool, error) {
				if curResource == "2" && childResource == "3" {
					return true, nil
				}
				return false, nil
			},
		},
	}
	checker := helperimpl.NewMappedResourceCascadeChecker(cascadeResourceMatchGroup)
	resource, err := checker.CheckCascadeResource(context.Background(), &common.ResourceCascadeParam{
		ResourceUri: "orgs/1/projects/2/clusters/3/update",
	})
	fmt.Println(resource, err)
}
