package http_middleware

import (
	"fmt"
	"git.aionnect.com/aionnect/go-common/utils/jws"
	"github.com/gin-gonic/gin"
	"regexp"
	"strings"
)

var tsPostfixPattern = regexp.MustCompile(`[?&](t=\d+&?)`) // 处理防重放防缓存的时间戳参数的正则

// 日志和错误处理需要记录日志中的请求信息处理
func splitUri(hostPrefix string, ctxt *gin.Context) (string, map[string]interface{}) {
	path := ctxt.Request.URL.Path
	method := ctxt.Request.Method
	raw := ctxt.Request.URL.RawQuery

	fields := make(map[string]interface{})
	uri := path
	if len(strings.TrimSpace(hostPrefix)) > 0 && !getHostPrefixPattern(hostPrefix).MatchString(path) {
		uri = strings.TrimSpace(hostPrefix) + "/" + strings.TrimLeft(path, "/")
	}
	query := string(raw)
	if sub := tsPostfixPattern.FindStringSubmatch(query); nil != sub && len(sub) > 1 {
		query = strings.Replace(query, sub[1], "", -1)
	}
	if raw != "" {
		path = uri + "?" + raw
	}
	if token := jws.GetToken(ctxt); len(token) > 0 {
		fields["token"] = token
	}
	fields["endpoint"] = fmt.Sprintf("%s %s", method, uri) // GET /service/test/test
	fields["uri"] = uri                                    // /service/test/test
	fields["query"] = query                                // name=test&sex=1
	fields["method"] = method                              // GET
	req := fmt.Sprintf("%s %s", method, path)              // GET /service/test/test?name=test&sex=1&t=32523535323
	return req, fields
}

func getHostPrefixPattern(hostPrefix string) *regexp.Regexp {
	return regexp.MustCompile("^" + strings.TrimSpace(hostPrefix)) // 处理子系统路径前缀的正则
}