package resources

import (
	commR "github.com/pingcap/test-infra/common/model/resource"
	sdkCore "github.com/pingcap/test-infra/sdk/core"
	sdkR "github.com/pingcap/test-infra/sdk/resource"
	"github.com/pingcap/test-infra/services/sdkserver/core"
)

type TestResource struct {
	core.Directory
	sdkResource sdkCore.Resource
}

func (t TestResource) ListEntry() ([]core.DirEntry, error) {
	return []core.DirEntry{
		{Name: "name", Resource: core.NewStringFile(t.sdkResource.Handle().Name)},
		{Name: "testResourceType", Resource: core.NewStringFile(string(t.sdkResource.Handle().Type))},
		{Name: "sdkHandle", Resource: core.NewJSON(t.sdkResource.Handle())},
	}, nil
}

func NewTestResource(sdkResource sdkCore.Resource) TestResource {
	t := TestResource{sdkResource: sdkResource}
	t.Init(&t)
	return t
}

func MakeResource(h commR.ResourceHandle) (core.Resource, error) {
	tr, err := sdkCore.ResolveResourceHandle(&h)
	if err != nil {
		return nil, core.NewNotAvailableError(err)
	}
	switch ttr := tr.(type) {
	case sdkR.TiDBCluster:
		return NewTidbCluster(ttr), nil
	default:
		return NewTestResource(tr), nil
	}
}
