/*
 * Copyright 2019-present Open Networking Foundation
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 * http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

// Package version is used to inject build time information via -X variables
package version

import (
	"fmt"
	"strings"
)

// Default build-time variable.
// These values can (should) be overridden via ldflags when built with
// `make`
var (
	version   = "unknown-version"
	goVersion = "unknown-goversion"
	vcsRef    = "unknown-vcsref"
	vcsDirty  = "unknown-vcsdirty"
	buildTime = "unknown-buildtime"
	os        = "unknown-os"
	arch      = "unknown-arch"
)

// InfoType is a collection of build time environment variables
type InfoType struct {
	Version   string `json:"version"`
	GoVersion string `json:"goversion"`
	VcsRef    string `json:"vcsref"`
	VcsDirty  string `json:"vcsdirty"`
	BuildTime string `json:"buildtime"`
	Os        string `json:"os"`
	Arch      string `json:"arch"`
}

// VersionInfo is an instance of build time environment variables populated at build time via -X arguments
var VersionInfo InfoType

func init() {
	VersionInfo = InfoType{
		Version:   version,
		VcsRef:    vcsRef,
		VcsDirty:  vcsDirty,
		GoVersion: goVersion,
		Os:        os,
		Arch:      arch,
		BuildTime: buildTime,
	}
}

func (v InfoType) String(indent string) string {
	builder := strings.Builder{}

	builder.WriteString(fmt.Sprintf("%sVersion:      %s\n", indent, VersionInfo.Version))
	builder.WriteString(fmt.Sprintf("%sGoVersion:    %s\n", indent, VersionInfo.GoVersion))
	builder.WriteString(fmt.Sprintf("%sVCS Ref:      %s\n", indent, VersionInfo.VcsRef))
	builder.WriteString(fmt.Sprintf("%sVCS Dirty:    %s\n", indent, VersionInfo.VcsDirty))
	builder.WriteString(fmt.Sprintf("%sBuilt:        %s\n", indent, VersionInfo.BuildTime))
	builder.WriteString(fmt.Sprintf("%sOS/Arch:      %s/%s\n", indent, VersionInfo.Os, VersionInfo.Arch))
	return builder.String()
}
