package resource

import (
	"io"

	"github.com/pingcap/test-infra/sdk/core"
)

// WorkloadNode is the workload node interface
// which is created pending and to exec() when available
type WorkloadNode interface {
	core.Resource
	Exec(opts WorkloadNodeExecOptions) (stdout string, stderr string, exitCode int, err error)
	// ExecAsync and ExecAsyncInterruptible will close stdout and stderr writer
	// if you use external writer such as os.stdout, add resource.NopCloser to wrap it
	ExecAsync(stdout io.WriteCloser, stderr io.WriteCloser, opts WorkloadNodeExecOptions) (remote RemoteCommander, err error)
	ExecAsyncInterruptible(stdout io.WriteCloser, opts WorkloadNodeExecOptions) (remote RemoteCommanderInterruptible, err error)
	WriteFile(opts WorkloadNodeWriteFileOptions) error
	ChaosSelect(selector WorkloadNodeSelectorOpts) ([]ChaosSelector, error)
	ChaosClient() ChaosClient
}

type WorkloadNodeExecOptions struct {
	Command string
	Peer    int
}

type WorkloadNodeWriteFileOptions struct {
	Content  io.Reader
	FilePath string
	Peer     int
}

// WorkloadNodeSelectorOpts defines how to select workload_node
type WorkloadNodeSelectorOpts struct {
	Peer int
	All  bool
}

type nopCloser struct {
	io.Writer
}

func (nopCloser) Close() error {
	return nil
}

func NopCloser(writer io.Writer) io.WriteCloser {
	return nopCloser{writer}
}
