package sanitize

import (
	"regexp"
	"strings"
)

// spaced returns the string padded with a space left and right.
func spaced(s string) string {
	return Space + s + Space
}

// replace performs a case-insensitive string replacement.
func replace(subject string, search string, replace string) string {
	return regexp.MustCompile("(?i)"+search).ReplaceAllString(subject, replace)
}

// SearchString replaces search operator with default symbols.
func SearchString(s string) string {
	if s == "" || reject(s, MaxLength) {
		return Empty
	}

	// Normalize.
	s = strings.ReplaceAll(s, "%%", "%")
	s = strings.ReplaceAll(s, "%", "*")
	s = strings.ReplaceAll(s, "**", "*")

	// Trim.
	return strings.Trim(s, "|\\<>\n\r\t")
}

// SearchQuery replaces search operator with default symbols.
func SearchQuery(s string) string {
	if s == "" || reject(s, MaxLength) {
		return Empty
	}

	// Normalize.
	s = replace(s, spaced(EnOr), Or)
	s = replace(s, spaced(EnOr), Or)
	s = replace(s, spaced(EnAnd), And)
	s = replace(s, spaced(EnWith), And)
	s = replace(s, spaced(EnIn), And)
	s = replace(s, spaced(EnAt), And)
	s = strings.ReplaceAll(s, SpacedPlus, And)
	s = strings.ReplaceAll(s, "%%", "%")
	s = strings.ReplaceAll(s, "%", "*")
	s = strings.ReplaceAll(s, "**", "*")

	// Trim.
	return strings.Trim(s, "|${}\\<>: \n\r\t")
}