package steps

import (
	"context"
	"fmt"
	"strconv"
	"time"

	apiresouce "github.com/pingcap/test-infra/common/model/resource"
	"github.com/pingcap/test-infra/sdk/resource"
)

type tidbFailure struct {
	target     *apiresouce.ResourceHandle
	failNodeID int
	duration   time.Duration
}

func NewTiDBFailure(target *apiresouce.ResourceHandle, duration time.Duration) *tidbFailure {
	return &tidbFailure{
		target:   target,
		duration: duration,
	}
}

func NewTiDBFailureWithID(target *apiresouce.ResourceHandle, failNodeID int, duration time.Duration) *tidbFailure {
	return &tidbFailure{
		target:     target,
		failNodeID: failNodeID,
		duration:   duration,
	}
}

func (s *tidbFailure) Execute(ctx context.Context) error {
	all := true
	fmt.Printf("fail node num=%+v", s.failNodeID)
	if strconv.Itoa(s.failNodeID) != "" {
		all = false
	}
	return NewChaosTask(
		s.target,
		resource.TiDBClusterSelectorOpts{
			TiDBClusterTiDBSelectorSpec: &resource.TiDBClusterTiDBSelectorSpec{
				Peer: &s.failNodeID,
				All:  all,
			},
		},
		&resource.FailureExperimentSpec{},
		s.duration).Execute(ctx)
}

func (s *tidbFailure) String() string {
	return fmt.Sprintf("tidbFailure: duration=%+v, failNode=%+v", s.duration, s.failNodeID)
}
