package framework

import (
	"fmt"
	"time"

	"k8s.io/apimachinery/pkg/util/wait"

	apiresource "github.com/pingcap/test-infra/common/model/resource"
	"github.com/pingcap/test-infra/sdk/resource"
	"github.com/pingcap/test-infra/sdk/resource/impl/k8s"
)

func (f *Framework) CreateDMCluster(testbed *k8s.Testbed) *k8s.DMCluster {
	client := k8s.NewDMClusterClient(f.KubeClientSetPack)

	r, err := client.Create([]byte(fmt.Sprintf(`{
    "name": "dc",
    "testbed": "%s",
    "type": "%s",
    "spec": {
        "version": "v2.0.3",
        "master": {
            "replicas": 1,
			"baseImage": "hub.pingcap.net/qa/dm",
			"config": {"log-level": "debug"}
        },
        "worker": {
            "replicas": 1,
			"baseImage": "hub.pingcap.net/qa/dm",
			"config": {"log-level": "debug"}
        }
    }
}
`, testbed.Name, apiresource.ResourceTypeDMCluster)))

	ExpectNoError(err)
	return r.(*k8s.DMCluster)
}

func (f *Framework) GetDMCluster(handle apiresource.ResourceHandle) *k8s.DMCluster {
	client := k8s.NewDMClusterClient(f.KubeClientSetPack)
	r, err := client.Get(handle)
	ExpectNoError(err)
	return r.(*k8s.DMCluster)
}

func (f *Framework) DeleteDMWaited(dm *k8s.DMCluster) {
	client := k8s.NewDMClusterClient(f.KubeClientSetPack)
	ExpectNoError(client.Delete(dm.ResourceHandle))

	err := wait.PollImmediate(poll, f.DeletionTimeout, func() (done bool, err error) {
		_, err = client.Get(dm.ResourceHandle)
		if resource.IsResourceNotFoundError(err) {
			return true, nil
		}
		return false, nil
	})
	ExpectNoError(err)
}

func (f *Framework) WaitForDMClusterReady(dm *k8s.DMCluster, timeout time.Duration) {
	ExpectNoError(dm.WaitForReady(timeout))
}

func (f *Framework) ArchiveDMCluster(handle apiresource.ResourceHandle, archiver resource.ArchiverFunc) {
	client := k8s.NewDMClusterClient(f.KubeClientSetPack)
	_, err := client.Artifact(handle, apiresource.GcArtifactAction{Log: true}, archiver)
	ExpectNoError(err)
}
