// Copyright 2021 PingCAP, Inc.
//
// 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,
// See the License for the specific language governing permissions and
// limitations under the License.

package version

import (
	"fmt"
	"runtime"
)

// ClinicVersion is the semver of Clinic
type ClinicVersion struct {
	major int
	minor int
	patch int
	name  string
}

// NewClinicVersion creates a ClinicVersion object
func NewClinicVersion() *ClinicVersion {
	return &ClinicVersion{
		major: ClinicVerMajor,
		minor: ClinicVerMinor,
		patch: ClinicVerPatch,
		name:  ClinicVerName,
	}
}

// Name returns the alternave name of ClinicVersion
func (v *ClinicVersion) Name() string {
	return v.name
}

// SemVer returns ClinicVersion in semver format
// NOTE: version with leading "v" is not a valid semver
func (v *ClinicVersion) SemVer() string {
	return fmt.Sprintf("%d.%d.%d", v.major, v.minor, v.patch)
}

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

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

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

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