package steps

import (
	"context"
	"fmt"

	"github.com/pingcap/test-infra/caselib/pkg/host"
	"github.com/pingcap/test-infra/caselib/pkg/utils"
	apiresource "github.com/pingcap/test-infra/common/model/resource"
	"github.com/pingcap/test-infra/sdk/core"
	"github.com/pingcap/test-infra/sdk/resource"
)

type mcCopy struct {
	mcRes      *apiresource.ResourceHandle
	mcCopyOpts *host.McCopyOpts
}

func (m mcCopy) String() string {
	return fmt.Sprintf("mc copy from %s to %s", m.mcCopyOpts.Src, m.mcCopyOpts.Dst)
}

func (m mcCopy) Execute(ctx context.Context) error {
	mcRes := utils.Try(core.ResolveResourceHandle(m.mcRes)).(resource.WorkloadNode)
	mcHost := host.NewMcHost(mcRes)
	return mcHost.Copy(m.mcCopyOpts)
}

var _ Step = &mcCopy{}

func (b *Builder) McCopy(mcCopyOpts *host.McCopyOpts, mcRes *apiresource.ResourceHandle) *Builder {
	b.steps = append(b.steps, mcCopy{mcRes, mcCopyOpts})
	return b
}

type mcRemove struct {
	mcRes    *apiresource.ResourceHandle
	mcRmOpts *host.McRmOpts
}

func (m mcRemove) String() string {
	return fmt.Sprintf("mc remove %s", m.mcRmOpts.Path)
}

func (m mcRemove) Execute(ctx context.Context) error {
	mcRes := utils.Try(core.ResolveResourceHandle(m.mcRes)).(resource.WorkloadNode)
	mcHost := host.NewMcHost(mcRes)
	return mcHost.Rm(m.mcRmOpts)
}

var _ Step = &mcRemove{}

func (b *Builder) McRemove(mcRmOpts *host.McRmOpts, mcRes *apiresource.ResourceHandle) *Builder {
	b.steps = append(b.steps, mcRemove{mcRes, mcRmOpts})
	return b
}

func NewMcRemove(mcRmOpts *host.McRmOpts, mcRes *apiresource.ResourceHandle) Step {
	return mcRemove{mcRes, mcRmOpts}

}
