package steps

import (
	"context"
	"fmt"
	"net/url"

	"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 loaderToMySQL struct {
	loaderRes *apiresource.ResourceHandle
	mysqlRes  *apiresource.ResourceHandle
	opts      *host.LoaderOpts
}

func (l loaderToMySQL) String() string {
	return fmt.Sprintf("Loader import from %s to %s, data dir: %s", l.loaderRes.Name, l.mysqlRes.Name, l.opts.DataDir)
}

func (l loaderToMySQL) Execute(ctx context.Context) error {
	mysqlRes := utils.Try(core.ResolveResourceHandle(l.mysqlRes)).(resource.MySQLCompatible)
	loaderHost := host.NewLoaderHost(utils.Try(core.ResolveResourceHandle(l.loaderRes)).(resource.WorkloadNode))
	mysqlUrl := utils.Try(mysqlRes.ServiceURL(resource.DBAddr)).(*url.URL)
	return loaderHost.Import(mysqlUrl, l.opts)
}

var _ Step = &loaderToMySQL{}

func (b *Builder) LoaderToMySQL(loaderRes, mysqlRes *apiresource.ResourceHandle, opts *host.LoaderOpts) *Builder {
	b.steps = append(b.steps, loaderToMySQL{loaderRes: loaderRes, mysqlRes: mysqlRes, opts: opts})
	return b
}
