package steps

import (
	"context"

	"github.com/pingcap/test-infra/caselib/pkg/host"
	dmmodel "github.com/pingcap/test-infra/caselib/pkg/model/dm"
	apiresource "github.com/pingcap/test-infra/common/model/resource"
)

type operateRelayStep struct {
	dmHost     *host.DMHost
	sourceName *string
	op         dmmodel.OperateRelayType
}

func (st *operateRelayStep) Execute(ctx context.Context) error {
	err := st.dmHost.OperateRelay(&dmmodel.RelayOption{
		SourceName:  st.sourceName,
		OperateType: st.op,
	})
	if err != nil {
		return err
	}
	return nil
}

func (st *operateRelayStep) String() string {
	return "start task by task file: " + *st.sourceName
}

func (b *Builder) DmStartRelay(dm *apiresource.ResourceHandle, dmHost *host.DMHost, sourceName *string) *Builder {
	b.steps = append(b.steps, &operateRelayStep{
		dmHost:     dmHost,
		sourceName: sourceName,
		op:         dmmodel.StartRelay,
	})
	return b
}

func (b *Builder) DmStopRelay(dm *apiresource.ResourceHandle, dmHost *host.DMHost, sourceName *string) *Builder {
	b.steps = append(b.steps, &operateRelayStep{
		dmHost:     dmHost,
		sourceName: sourceName,
		op:         dmmodel.StopRelay,
	})
	return b
}

func (b *Builder) DmPauseRelay(dm *apiresource.ResourceHandle, dmHost *host.DMHost, sourceName *string) *Builder {
	b.steps = append(b.steps, &operateRelayStep{
		dmHost:     dmHost,
		sourceName: sourceName,
		op:         dmmodel.PauseRelay,
	})
	return b
}

func (b *Builder) DmResumeRelay(dm *apiresource.ResourceHandle, dmHost *host.DMHost, sourceName *string) *Builder {
	b.steps = append(b.steps, &operateRelayStep{
		dmHost:     dmHost,
		sourceName: sourceName,
		op:         dmmodel.ResumeRelay,
	})
	return b
}

func (b *Builder) DmCheckIfSourceRelayStart(dm *apiresource.ResourceHandle, dmHost *host.DMHost, sourceName string) *Builder {
	b.steps = append(b.steps, &checkIfSourceRelayStartStep{
		dmHost:     dmHost,
		sourceName: sourceName,
	})
	return b
}
func (b *Builder) DmCheckIfSourceRelayStop(dm *apiresource.ResourceHandle, dmHost *host.DMHost, sourceName string) *Builder {
	b.steps = append(b.steps, &checkIfSourceRelayStopStep{
		dmHost:     dmHost,
		sourceName: sourceName,
	})
	return b
}
