package debug

import (
	_debug "runtime/debug"
)

// Run will only call fn if DEBUG is enabled.
func Run(fn func()) {
	if DEBUG {
		fn()
	}
}

// BuildInfo will return a useful new-line separated build info string for current binary, setting name as given value.
func BuildInfo(name string) string {
	// Read build info from current binary
	build, ok := _debug.ReadBuildInfo()
	if !ok {
		return "name=" + name + "\n"
	}

	var flags, vcs, commit, time string

	// Parse build information from BuildInfo.Settings
	for i := 0; i < len(build.Settings); i++ {
		switch build.Settings[i].Key {
		case "-gcflags":
			flags += ` -gcflags="` + build.Settings[i].Value + `"`
		case "-ldflags":
			flags += ` -ldflags="` + build.Settings[i].Value + `"`
		case "-tags":
			flags += ` -tags="` + build.Settings[i].Value + `"`
		case "vcs":
			vcs = build.Settings[i].Value
		case "vcs.revision":
			commit = build.Settings[i].Value
			if len(commit) > 8 {
				commit = commit[:8]
			}
		case "vcs.time":
			time = build.Settings[i].Value
		}
	}

	return "" +
		"name=" + name + "\n" +
		"vcs=" + vcs + "\n" +
		"commit=" + commit + "\n" +
		"version=" + build.Main.Version + "\n" +
		"path=" + build.Path + "\n" +
		"build=" + build.GoVersion + flags + "\n" +
		"time=" + time + "\n"
}