package cmdVersion

import (
	u "nexus-client/utils"
	"nexus-client/version"
	libclient "nexus-libclient/version"
)

type Version struct {
	Name string
}

func (cmd *Version) GetName() string {
	return cmd.Name
}

func (cmd *Version) GetDesc() []string {
	return []string{
		"Display nexus server and client's versions."}
}

func (cmd *Version) PrintUsage() {
	for _, desc := range cmd.GetDesc() {
		u.PrintlnErr(desc)
	}
	u.PrintlnErr("―――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――")
	u.PrintlnErr("USAGE: " + cmd.GetName())
	u.PrintlnErr("―――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――")
}

func (cmd *Version) Run(args []string) int {
	if len(args) > 0 {
		cmd.PrintUsage()
		return 1
	}

	serverVersion, err := libclient.GetServerVersion()
	if err != nil {
		u.PrintlnErr("Error: " + err.Error())
		return 1
	}

	clientVersion := version.Get()
	u.Println("client version: " + clientVersion.String())
	u.Println("server version: " + serverVersion.String())
	return 0
}

// Checks the client version is compatible with the server's API.
func CheckServerCompatibility(appname string) bool {
	// Checks the client version is compatible with the server's API.
	serverVersion, err := libclient.GetServerVersion()
	if err != nil {
		u.PrintlnErr("Error: " + err.Error())
		return false
	}
	clientVersion := version.Get()
	if !clientVersion.IsCompatible(serverVersion) {
		u.PrintlnErr(appname + " version " + clientVersion.String() + " is not compatible with server version " + serverVersion.String() + ".")
		if clientVersion.IsOlder(serverVersion) {
			u.PrintlnErr("Please upgrade " + appname + " to version " + serverVersion.StringWithoutBugfix() + ".")
		} else {
			u.PrintlnErr("Please downgrade " + appname + " to version " + serverVersion.StringWithoutBugfix() + ".")
		}
		return false
	}

	return true
}