package teapot

import (
	"bufio"
	"bytes"
	"log/slog"
	"os/exec"
	"regexp"
	"sync"
)

func runCommand(args []string) (
	stdoutBuf *bytes.Buffer, err error,
) {
	re := regexp.MustCompile(`\x1b\[[0-9;]*[a-zA-Z]`)
	cmd := exec.Command("joint-teapot", args...) // #nosec G204
	stdoutBuf = new(bytes.Buffer)
	cmd.Stdout = stdoutBuf
	stderr, err := cmd.StderrPipe()
	if err != nil {
		slog.Error("stderr pipe", "error", err)
		return
	}
	var wg sync.WaitGroup
	wg.Add(1)
	scanner := bufio.NewScanner(stderr)
	go func() {
		for scanner.Scan() {
			text := re.ReplaceAllString(scanner.Text(), "")
			if text == "" {
				continue
			}
			slog.Info("joint-teapot", "stderr", text)
		}
		wg.Done()
		if scanner.Err() != nil {
			slog.Error("stderr scanner", "error", scanner.Err())
		}
	}()
	if err = cmd.Start(); err != nil {
		slog.Error("cmd start", "error", err)
		return
	}
	wg.Wait()
	if err = cmd.Wait(); err != nil {
		if exitErr, ok := err.(*exec.ExitError); ok {
			exitCode := exitErr.ExitCode()
			slog.Error("cmd completed with non-zero exit code",
				"error", err,
				"exitCode", exitCode)
		} else {
			slog.Error("cmd wait", "error", err)
		}
		return
	}
	return
}