package mock_test

import (
	"bytes"
	"fmt"
	"github.com/SAP/jenkins-library/pkg/command"
	"github.com/SAP/jenkins-library/pkg/mock"
	"io"
	"strings"
)

type ExecRunner interface {
	SetDir(d string)
	SetEnv(e []string)
	Stdout(out io.Writer)
	Stderr(err io.Writer)
	RunExecutable(e string, p ...string) error
}

func getMavenVersion(runner ExecRunner) (string, error) {
	output := bytes.Buffer{}
	runner.Stdout(&output)
	err := runner.RunExecutable("mvn", "--version")
	if err != nil {
		return "", fmt.Errorf("failed to run maven: %w", err)
	}
	logLines := strings.Split(output.String(), "\n")
	if len(logLines) < 1 {
		return "", fmt.Errorf("failed to obtain maven output")
	}
	return logLines[0], nil
}

func ExampleDockerExecRunner_RunExecutable() {
	// getMavenVersion(runner ExecRunner) executes the command "mvn --version"
	// and returns the command output as string
	runner := command.Command{}
	localMavenVersion, _ := getMavenVersion(&runner)

	dockerRunner := mock.DockerExecRunner{Runner: &runner}
	_ = dockerRunner.AddExecConfig("mvn", mock.DockerExecConfig{
		Image: "maven:3.6.1-jdk-8",
	})

	dockerMavenVersion, _ := getMavenVersion(&dockerRunner)

	fmt.Printf("Your local mvn version is %v, while the version in docker is %v", localMavenVersion, dockerMavenVersion)
}
