package util

import "strings"

var quotePlusTable = func() [256]string {
	var t [256]string
	for i := 0; i < 256; i++ {
		c := byte(i)
		if (c >= 'a' && c <= 'z') || (c >= 'A' && c <= 'Z') || (c >= '0' && c <= '9') ||
			c == '-' || c == '_' || c == '.' || c == '~' {
			t[i] = string(c)
		} else if c == ' ' {
			t[i] = "+"
		} else {
			t[i] = "%" + strings.ToUpper(hexEncode(c))
		}
	}
	return t
}()

var quoteTable = func() [256]string {
	var t [256]string
	for i := 0; i < 256; i++ {
		c := byte(i)
		if (c >= 'a' && c <= 'z') || (c >= 'A' && c <= 'Z') || (c >= '0' && c <= '9') ||
			c == '-' || c == '_' || c == '.' || c == '~' || c == '/' {
			t[i] = string(c)
		} else {
			t[i] = "%" + strings.ToUpper(hexEncode(c))
		}
	}
	return t
}()

func hexEncode(b byte) string {
	const hex = "0123456789abcdef"
	return string([]byte{hex[b>>4], hex[b&0xf]})
}

// QuotePlus replicates Python urllib.parse.quote_plus with default safe="".
func QuotePlus(s string) string {
	var sb strings.Builder
	for i := 0; i < len(s); i++ {
		sb.WriteString(quotePlusTable[s[i]])
	}
	return sb.String()
}

// Quote replicates Python urllib.parse.quote with default safe="/".
func Quote(s string) string {
	var sb strings.Builder
	for i := 0; i < len(s); i++ {
		sb.WriteString(quoteTable[s[i]])
	}
	return sb.String()
}
