package main

import (
	"runtime/debug"
	"strings"

	"gopkg.in/yaml.v3"
)

// Usually set by whatever is building the binary with a `-x main.version=22`, for example
// in `make build`.
var version = "unknown"

type versionDescription struct {
	ImageBuilder struct {
		Version      string `yaml:"version"`
		Commit       string `yaml:"commit"`
		Dependencies struct {
			Images string `yaml:"images"`
		} `yaml:"dependencies"`
	} `yaml:"image-builder"`
}

func readVersionFromBinary() *versionDescription {
	// We'll be getting these values from the build info if they're available, otherwise
	// they will always be set to unknown. Note that `version` is set globally so it can
	// be defined by whatever is building this project.
	commit := "unknown"
	images := "unknown"

	if bi, ok := debug.ReadBuildInfo(); ok {
		for _, bs := range bi.Settings {
			switch bs.Key {
			case "vcs.revision":
				commit = bs.Value
			}
		}

		for _, dep := range bi.Deps {
			if dep.Path == "github.com/osbuild/images" {
				images = dep.Version
			}
		}
	}

	vd := &versionDescription{}

	vd.ImageBuilder.Version = version
	vd.ImageBuilder.Commit = commit

	vd.ImageBuilder.Dependencies.Images = images

	return vd
}

func prettyVersion() string {
	var b strings.Builder

	enc := yaml.NewEncoder(&b)
	enc.SetIndent(2)

	enc.Encode(readVersionFromBinary())

	return b.String()
}
