package shell

import (
	"bytes"
	"context"
	"os"
	"os/exec"
	"strings"

	"forge.cadoles.com/Cadoles/emissary/internal/agent/metadata"
	"github.com/pkg/errors"
)

type Collector struct {
	name    string
	command string
	args    []string
}

// Collect implements agent.MetadataCollector
func (c *Collector) Collect(ctx context.Context) (string, string, error) {
	cmd := exec.CommandContext(ctx, c.command, c.args...)

	var buf bytes.Buffer

	cmd.Stdout = &buf
	cmd.Stderr = os.Stderr

	if err := cmd.Run(); err != nil {
		return "", "", errors.WithStack(err)
	}

	value := strings.TrimSpace(buf.String())

	return c.name, value, nil
}

func NewCollector(name string, command string, args ...string) *Collector {
	return &Collector{
		name:    name,
		command: command,
		args:    args,
	}
}

var _ metadata.Collector = &Collector{}