package shared

import (
	"strings"

	"golang.org/x/text/cases"
	"golang.org/x/text/unicode/norm"
)

// TextComparisonPolicy identifies the shared D&D text-comparison semantics.
// A semantic change requires a new value and a review of every dependent
// identity, mapping, normalization, and validator policy.
const TextComparisonPolicy = "dnd.text_comparison.v1"

// ComparisonKey returns the D&D Unicode- and case-insensitive comparison key.
func ComparisonKey(value string) string {
	value = norm.NFKC.String(value)
	value = strings.Map(func(r rune) rune {
		switch r {
		case '\u2018', '\u2019', '\u02bc':
			return '\''
		default:
			return r
		}
	}, value)
	value = strings.Join(strings.Fields(value), " ")
	return cases.Fold().String(value)
}
