package clean

import (
	"path"
	"strings"
	"unicode"
)

// Path removes invalid character from a path string.
func Path(s string) string {
	if s == "" || reject(s, 512) || strings.Contains(s, "..") || strings.Contains(s, "//") {
		return ""
	}

	// Trim whitespace.
	s = strings.TrimSpace(s)

	// Remove non-printable and other potentially problematic characters.
	s = strings.Map(func(r rune) rune {
		if !unicode.IsPrint(r) {
			return -1
		}

		switch r {
		case '~', '\\', ':', '|', '"', '?', '*', '<', '>', '{', '}':
			return -1
		default:
			return r
		}
	}, s)

	return s
}

// UserPath sanitizes and normalizes a user provided path, so it can be used.
func UserPath(dir string) string {
	if dir == "" {
		return dir
	}

	dir = strings.Trim(path.Clean(Path(strings.ReplaceAll(dir, "\\", "/"))), "./ \\*%#~?|<>:")

	if strings.Contains(dir, "/.") || strings.Contains(dir, "..") || strings.Contains(dir, "//") {
		return ""
	}

	return dir
}
