// Copyright The Monogon Project Authors.
// SPDX-License-Identifier: Apache-2.0

// Package version is a companion library to the //version/spec proto.
package version

import (
	"fmt"
	"strings"

	"source.monogon.dev/version/spec"
)

// Release converts a spec.Version's Release field into a SemVer 2.0.0 compatible
// string in the X.Y.Z form.
func Release(rel *spec.Version_Release) string {
	if rel == nil {
		return "0.0.0"
	}
	return fmt.Sprintf("%d.%d.%d", rel.Major, rel.Minor, rel.Patch)
}

// Semver converts a spec.Version proto message into a SemVer 2.0.0 compatible
// string.
func Semver(v *spec.Version) string {
	ver := Release(v.Release)
	var prerelease []string
	if git := v.GitInformation; git != nil {
		if n := git.CommitsSinceRelease; n != 0 {
			prerelease = append(prerelease, fmt.Sprintf("dev%d", n))
		}
		prerelease = append(prerelease, fmt.Sprintf("g%s", git.CommitHash[:8]))
		if git.BuildTreeState != spec.Version_GitInformation_BUILD_TREE_STATE_CLEAN {
			prerelease = append(prerelease, "dirty")
		}
	} else {
		prerelease = append(prerelease, "nostamp")
	}

	if len(prerelease) > 0 {
		ver += "-" + strings.Join(prerelease, ".")
	}
	return ver
}

// ReleaseLessThan returns true if Release a is lexicographically smaller than b.
func ReleaseLessThan(a, b *spec.Version_Release) bool {
	if a.Major != b.Major {
		return a.Major < b.Major
	}
	if a.Minor != b.Minor {
		return a.Minor < b.Minor
	}
	if a.Patch != b.Patch {
		return a.Patch < b.Patch
	}
	return false
}
