package version

import (
	"fmt"
	"runtime"
)

// VersionInfo is the semver of TiUP
type VersionInfo struct {
	major int
	minor int
	patch int
	name  string
}

// NewVersionInfo creates a VersionInfo object
func NewVersionInfo() *VersionInfo {
	return &VersionInfo{
		major: VerMajor,
		minor: VerMinor,
		patch: VerPatch,
		name:  VerName,
	}
}

// Name returns the alternative name VersionInfo
func (v *VersionInfo) Name() string {
	return v.name
}

// SemVer returns VersionInfo in semver format
func (v *VersionInfo) SemVer() string {
	return fmt.Sprintf("%d.%d.%d", v.major, v.minor, v.patch)
}

// String converts VersionInfo to a string
func (v *VersionInfo) String() string {
	return fmt.Sprintf("%s %s\n%s", v.SemVer(), v.name, NewBuildInfo())
}

// BuildInfo is the info of building environment
type BuildInfo struct {
	GitHash   string `json:"gitHash"`
	GitRef    string `json:"gitRef"`
	GoVersion string `json:"goVersion"`
}

// NewBuildInfo creates a BuildInfo object
func NewBuildInfo() *BuildInfo {
	return &BuildInfo{
		GitHash:   GitHash,
		GitRef:    GitRef,
		GoVersion: runtime.Version(),
	}
}

// String converts BuildInfo to a string
func (v *BuildInfo) String() string {
	return fmt.Sprintf("Go Version: %s\nGit Ref: %s\nGitHash: %s", v.GoVersion, v.GitRef, v.GitHash)
}