package quadlet

import (
	"fmt"
	"os"
	"path"
	"sort"
)

// Overwritten at build time
var (
	_binDir = "/usr/bin"
)

func podmanBinary() string {
	podman := os.Getenv("PODMAN")
	if len(podman) > 0 {
		return podman
	}
	return path.Join(_binDir, "podman")
}

/* This is a helper for constructing podman commandlines */
type PodmanCmdline struct {
	Args []string
}

func (c *PodmanCmdline) add(args ...string) {
	c.Args = append(c.Args, args...)
}

func (c *PodmanCmdline) addf(format string, a ...interface{}) {
	c.add(fmt.Sprintf(format, a...))
}

func (c *PodmanCmdline) addKeys(arg string, keys map[string]string) {
	ks := make([]string, 0, len(keys))
	for k := range keys {
		ks = append(ks, k)
	}
	sort.Strings(ks)

	for _, k := range ks {
		c.add(arg, fmt.Sprintf("%s=%s", k, keys[k]))
	}
}

func (c *PodmanCmdline) addEnv(env map[string]string) {
	c.addKeys("--env", env)
}

func (c *PodmanCmdline) addLabels(labels map[string]string) {
	c.addKeys("--label", labels)
}

func (c *PodmanCmdline) addAnnotations(annotations map[string]string) {
	c.addKeys("--annotation", annotations)
}

func (c *PodmanCmdline) addBool(arg string, val bool) {
	if val {
		c.add(arg)
	} else {
		c.addf("%s=false", arg)
	}
}

func NewPodmanCmdline(args ...string) *PodmanCmdline {
	c := &PodmanCmdline{
		Args: make([]string, 0),
	}

	c.add(podmanBinary())
	c.add(args...)
	return c
}