// Package matcher 提供 nginx 风格的 location 匹配引擎实现。
//
// 该文件实现前缀优先匹配器（^~ 类型），比普通前缀匹配优先级更高。
//
// 作者：xfy
package matcher

import "github.com/valyala/fasthttp"

// PrefixPriorityMatcher 前缀优先匹配器（^~ 类型）。
//
// 基于 Radix Tree 实现，优先级为 2（仅次于精确匹配）。
// 对应 nginx 的 ^~ 修饰符：匹配成功后跳过正则匹配阶段。
type PrefixPriorityMatcher struct {
	// tree 基数树，存储前缀优先路径
	tree *RadixTree

	// priority 匹配优先级，^~ 类型为 2
	priority int
}

// NewPrefixPriorityMatcher 创建前缀优先匹配器。
//
// 返回值：
//   - *PrefixPriorityMatcher: 前缀优先匹配器实例
func NewPrefixPriorityMatcher() *PrefixPriorityMatcher {
	return &PrefixPriorityMatcher{
		tree:     NewRadixTree(),
		priority: 2, // ^~ 类型优先级更高
	}
}

// AddPath 添加路径到前缀优先匹配器。
//
// 参数：
//   - path: 前缀优先路径
//   - handler: 匹配成功后的请求处理器
//   - internal: 是否为 internal location
//
// 返回值：
//   - error: 路径重复或树已初始化时返回错误
func (ppm *PrefixPriorityMatcher) AddPath(path string, handler fasthttp.RequestHandler, internal bool) error {
	return ppm.tree.Insert(path, handler, ppm.priority, "prefix_priority", internal)
}

// Match 前缀优先匹配，返回最长前缀匹配结果。
//
// 参数：
//   - path: 待匹配的请求路径
//
// 返回值：
//   - *MatchResult: 最长前缀匹配结果，无匹配时返回 nil
func (ppm *PrefixPriorityMatcher) Match(path string) *MatchResult {
	return ppm.tree.FindLongestPrefix(path)
}

// MarkInitialized 标记初始化完成。
//
// 调用后不能再添加新路径。
func (ppm *PrefixPriorityMatcher) MarkInitialized() {
	ppm.tree.MarkInitialized()
}
