// Package util...
//
// Description : util...
//
// Author : go_developer@163.com<白茶清欢>
//
// Date : 2021-11-04 2:38 下午
package util

import (
	"net/url"
	"strings"
)

// URLParseResult url解析
//
// Author : go_developer@163.com<白茶清欢>
//
// Date : 2:51 下午 2021/11/4
type URLParseResult struct {
	Scheme    string            `json:"scheme"`
	Domain    string            `json:"domain"`
	URI       string            `json:"uri"`
	Parameter map[string]string `json:"parameter"`
}

// URLEncode ...
//
// Author : go_developer@163.com<白茶清欢>
//
// Date : 2:39 下午 2021/11/4
func URLEncode(inputURL string) string {
	return url.QueryEscape(inputURL)
}

// URLDecode ...
//
// Author : go_developer@163.com<白茶清欢>
//
// Date : 2:39 下午 2021/11/4
func URLDecode(inputURL string) (string, error) {
	return url.QueryUnescape(inputURL)
}

// URLParse url解析
//
// Author : go_developer@163.com<白茶清欢>
//
// Date : 2:39 下午 2021/11/4
func URLParse(inputURL string) (*URLParseResult, error) {
	var (
		parseResult *url.URL
		err         error
	)
	if parseResult, err = url.Parse(inputURL); nil != err {
		return nil, err
	}
	detail := &URLParseResult{
		Scheme:    parseResult.Scheme,
		Domain:    parseResult.Host,
		URI:       parseResult.Path,
		Parameter: make(map[string]string),
	}
	for k, v := range parseResult.Query() {
		if len(v) > 1 {
			detail.Parameter[k] = "[" + strings.Join(v, ",") + "]"
		} else {
			detail.Parameter[k] = v[0]
		}
	}
	return detail, nil
}

// BuildQueryURL 构建GET链接
//
// Author : go_developer@163.com<白茶清欢>
//
// Date : 2:43 下午 2021/11/4
func BuildQueryURL(apiURL string, parameter map[string]string) string {
	u := url.Values{}
	for k, v := range parameter {
		u.Set(k, v)
	}
	apiURL = strings.Trim(apiURL, "?")
	if strings.Contains(apiURL, "?") {
		return apiURL + "&" + u.Encode()
	}
	return apiURL + "?" + u.Encode()
}