package textutil

import (
	"regexp"
	"strings"
	"unicode"
)

// We leave the full range of unicode letters in tact, but remove all "special" characters,
// including spaces and dots, which are not supported in e.g. experiment names or YAML keys.
func NormalizeString(name string) string {
	name = strings.ToLower(name)
	s := strings.Map(replaceNonAlphanumeric, name)

	// replacing multiple underscores with a single one
	re := regexp.MustCompile(`_+`)
	s = re.ReplaceAllString(s, "_")

	// removing leading and trailing underscores
	return strings.Trim(s, "_")
}

func replaceNonAlphanumeric(r rune) rune {
	if unicode.IsLetter(r) || unicode.IsDigit(r) {
		return r
	}
	return '_'
}