package main

import (
	"os"
	"os/exec"
	"strings"
)

// run executes a command and returns combined stdout+stderr as a string.
// Non-zero exit is NOT an error here: smartctl uses a bitmask exit code (e.g.
// bit 0 = command-line error, bits 3-7 = disk health flags) yet still prints
// valid JSON/text, and MegaCLI is similarly noisy. We want whatever it printed.
func run(name string, args ...string) string {
	cmd := exec.Command(name, args...)
	out, _ := cmd.CombinedOutput()
	return string(out)
}

// lookPath returns the first existing executable from candidates, trying PATH
// first (via exec.LookPath) then absolute fallbacks. Returns "" if none found.
func lookPath(candidates ...string) string {
	for _, c := range candidates {
		if strings.ContainsRune(c, os.PathSeparator) {
			if fi, err := os.Stat(c); err == nil && !fi.IsDir() {
				return c
			}
			continue
		}
		if p, err := exec.LookPath(c); err == nil {
			return p
		}
	}
	return ""
}

// hostname returns the host identity, preferring the FQDN from "hostname -f",
// then os.Hostname, then "unknown" so records always carry a host tag.
func hostname() string {
	if h := strings.TrimSpace(run("hostname", "-f")); h != "" {
		return h
	}
	if h, err := os.Hostname(); err == nil {
		return h
	}
	return "unknown"
}
