package jobqueue

import (
	"os/exec"
	"strings"
)

// ShellResult is a result of a shell script
type ShellResult struct {
	Output   string
	Error    string
	ExitCode int
}

type ShellRunnable struct {
	ScriptPath string
}

func (s *ShellRunnable) Run() (RunResult[ShellResult], error) {
	cmd := exec.Command("sh", s.ScriptPath)
	output, err := cmd.Output()

	var stderr []byte
	if err != nil {
		stderr = err.(*exec.ExitError).Stderr
	}

	exitCode := 0

	if err != nil {
		if exitError, ok := err.(*exec.ExitError); ok {
			exitCode = exitError.ExitCode()
		}
		return RunResult[ShellResult]{
			Status: ResultStatusFailed,
			Data: ShellResult{
				Output:   string(output),
				ExitCode: exitCode,
				Error:    string(stderr),
			},
		}, err
	}

	return RunResult[ShellResult]{
		Status: ResultStatusSuccess,
		Data: ShellResult{
			Output:   strings.TrimSpace(string(output)),
			ExitCode: exitCode,
			Error:    string(stderr),
		},
	}, nil
}