package utils

import (
	"fmt"
	"regexp"

	"github.com/Masterminds/semver"
)

var versionRegexp = regexp.MustCompile(`^v\d+(\.\d+)*`)

type Version struct {
	value *semver.Version
}

func NewVersion(version string) (*Version, error) {
	v, err := semver.NewVersion(NormalizeVersion(version))
	if err != nil {
		return nil, fmt.Errorf("invalid version: %s", version)
	}
	return &Version{value: v}, nil
}

func (t *Version) Lt(anotherVersion string) (bool, error) {
	av, err := semver.NewVersion(NormalizeVersion(anotherVersion))
	if err != nil {
		return false, fmt.Errorf("invalid another version: %s", anotherVersion)
	}
	return t.value.LessThan(av), nil
}

func (t *Version) Lte(anotherVersion string) (bool, error) {
	av, err := semver.NewVersion(NormalizeVersion(anotherVersion))
	if err != nil {
		return false, fmt.Errorf("invalid another version: %s", anotherVersion)
	}
	return t.value.LessThan(av) || t.value.Equal(av), nil
}

func (t *Version) Gt(anotherVersion string) (bool, error) {
	av, err := semver.NewVersion(NormalizeVersion(anotherVersion))
	if err != nil {
		return false, fmt.Errorf("invalid another version: %s", anotherVersion)
	}
	return t.value.GreaterThan(av), nil
}

func (t *Version) Gte(anotherVersion string) (bool, error) {
	av, err := semver.NewVersion(NormalizeVersion(anotherVersion))
	if err != nil {
		return false, fmt.Errorf("invalid another version: %s", anotherVersion)
	}
	return t.value.GreaterThan(av) || t.value.Equal(av), nil
}

func NormalizeVersion(version string) string {
	return versionRegexp.FindString(version)
}
