package utils

import (
	"os"
	"path/filepath"
	"regexp"
	"runtime"
	"strconv"
	"strings"
)

// GetGOPATHs returns all paths in GOPATH variable.
func GetGOPATHs() []string {
	gopath := os.Getenv("GOPATH")
	if gopath == "" && compareGoVersion(runtime.Version(), "go1.8") >= 0 {
		gopath = defaultGOPATH()
	}
	return filepath.SplitList(gopath)
}

func compareGoVersion(a, b string) int {
	reg := regexp.MustCompile("^\\d*")

	a = strings.TrimPrefix(a, "go")
	b = strings.TrimPrefix(b, "go")

	versionsA := strings.Split(a, ".")
	versionsB := strings.Split(b, ".")

	for i := 0; i < len(versionsA) && i < len(versionsB); i++ {
		versionA := versionsA[i]
		versionB := versionsB[i]

		vA, err := strconv.Atoi(versionA)
		if err != nil {
			str := reg.FindString(versionA)
			if str != "" {
				vA, _ = strconv.Atoi(str)
			} else {
				vA = -1
			}
		}

		vB, err := strconv.Atoi(versionB)
		if err != nil {
			str := reg.FindString(versionB)
			if str != "" {
				vB, _ = strconv.Atoi(str)
			} else {
				vB = -1
			}
		}

		if vA > vB {
			// vA = 12, vB = 8
			return 1
		} else if vA < vB {
			// vA = 6, vB = 8
			return -1
		} else if vA == -1 {
			// vA = rc1, vB = rc3
			return strings.Compare(versionA, versionB)
		}

		// vA = vB = 8
		continue
	}

	if len(versionsA) > len(versionsB) {
		return 1
	} else if len(versionsA) == len(versionsB) {
		return 0
	}

	return -1
}

func defaultGOPATH() string {
	env := "HOME"
	if runtime.GOOS == "windows" {
		env = "USERPROFILE"
	} else if runtime.GOOS == "plan9" {
		env = "home"
	}
	if home := os.Getenv(env); home != "" {
		return filepath.Join(home, "go")
	}
	return ""
}