package steps

import (
	"context"
	"fmt"
	"time"

	"github.com/pingcap/errors"
	"github.com/pingcap/log"
	"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"
	"go.uber.org/zap"
)

var TimeoutErr = errors.New("Exec command timeout")

type startBinlogArbiter struct {
	arbiter *apiresource.ResourceHandle
}

func NewStartBinlogArbiter(arbiter *apiresource.ResourceHandle) Step {
	return &startBinlogArbiter{
		arbiter: arbiter,
	}
}

func (c *startBinlogArbiter) Execute(ctx context.Context) error {
	// satrt arbiter
	cmd := "nohup /arbiter --config /arbiter.toml &"
	wl := utils.Try(core.ResolveResourceHandle(c.arbiter)).(resource.WorkloadNode)
	workloadHost := host.NewWorkloadHost(wl)
	o, err := workloadHost.Exec(cmd, 30*time.Minute)
	if err == TimeoutErr {
		return errors.Trace(err)
	}
	if o.Stderr != "" {
		log.Error("run workload", zap.String("stderr", o.Stderr))
	}
	return nil
}

func (c *startBinlogArbiter) String() string {
	return fmt.Sprintf("start arbiter")
}

func (b *Builder) StartBinlogArbiter(arbiter *apiresource.ResourceHandle) *Builder {
	b.steps = append(b.steps, NewStartBinlogArbiter(arbiter))
	return b
}
