// Package handler 提供路由器功能的测试。
//
// 该文件测试路由器模块的各项功能，包括：
//   - GET 路由注册
//   - POST 路由注册
//   - PUT 路由注册
//   - DELETE 路由注册
//   - HEAD 路由注册
//   - 多方法路由区分
//   - 多路由注册
//   - 未匹配路由处理
//
// 作者：xfy
package handler

import (
	"testing"

	"github.com/valyala/fasthttp"
)

// TestRouterGET 测试 GET 路由注册。
func TestRouterGET(t *testing.T) {
	r := NewRouter()

	var called bool
	handler := func(ctx *fasthttp.RequestCtx) {
		called = true
		_, _ = ctx.WriteString("GET response")
	}

	r.GET("/test", handler)

	// 模拟 GET 请求
	var ctx fasthttp.RequestCtx
	ctx.Request.Header.SetMethod("GET")
	ctx.Request.SetRequestURI("/test")

	r.Handler()(&ctx)

	if !called {
		t.Error("GET handler 未被调用")
	}
	if string(ctx.Response.Body()) != "GET response" {
		t.Errorf("响应体 = %q, want %q", string(ctx.Response.Body()), "GET response")
	}
}

// TestRouterPOST 测试 POST 路由注册。
func TestRouterPOST(t *testing.T) {
	r := NewRouter()

	var called bool
	handler := func(ctx *fasthttp.RequestCtx) {
		called = true
		_, _ = ctx.WriteString("POST response")
	}

	r.POST("/submit", handler)

	// 模拟 POST 请求
	var ctx fasthttp.RequestCtx
	ctx.Request.Header.SetMethod("POST")
	ctx.Request.SetRequestURI("/submit")

	r.Handler()(&ctx)

	if !called {
		t.Error("POST handler 未被调用")
	}
	if string(ctx.Response.Body()) != "POST response" {
		t.Errorf("响应体 = %q, want %q", string(ctx.Response.Body()), "POST response")
	}
}

// TestRouterMultipleMethods 测试同路径不同方法的区分。
func TestRouterMultipleMethods(t *testing.T) {
	r := NewRouter()

	var getCalled, postCalled bool

	r.GET("/api", func(ctx *fasthttp.RequestCtx) {
		getCalled = true
		_, _ = ctx.WriteString("GET api")
	})

	r.POST("/api", func(ctx *fasthttp.RequestCtx) {
		postCalled = true
		_, _ = ctx.WriteString("POST api")
	})

	// 测试 GET 请求
	var getCtx fasthttp.RequestCtx
	getCtx.Request.Header.SetMethod("GET")
	getCtx.Request.SetRequestURI("/api")

	r.Handler()(&getCtx)

	if !getCalled {
		t.Error("GET handler 未被调用")
	}
	if postCalled {
		t.Error("POST handler 不应被调用")
	}
	if string(getCtx.Response.Body()) != "GET api" {
		t.Errorf("GET 响应体 = %q, want %q", string(getCtx.Response.Body()), "GET api")
	}

	// 重置并测试 POST 请求
	var postCtx fasthttp.RequestCtx
	postCtx.Request.Header.SetMethod("POST")
	postCtx.Request.SetRequestURI("/api")

	r.Handler()(&postCtx)

	if !postCalled {
		t.Error("POST handler 未被调用")
	}
	if string(postCtx.Response.Body()) != "POST api" {
		t.Errorf("POST 响应体 = %q, want %q", string(postCtx.Response.Body()), "POST api")
	}
}

// TestRouterHandlerNotNil 测试 Handler() 返回非 nil。
func TestRouterHandlerNotNil(t *testing.T) {
	r := NewRouter()

	handler := r.Handler()
	if handler == nil {
		t.Error("Handler() 返回 nil, want non-nil")
	}
}

// TestRouterMultipleRoutes 测试多路由注册。
func TestRouterMultipleRoutes(t *testing.T) {
	r := NewRouter()

	routes := map[string]string{
		"/users":    "users handler",
		"/products": "products handler",
		"/orders":   "orders handler",
	}

	for path, response := range routes {
		r.GET(path, func(ctx *fasthttp.RequestCtx) {
			_, _ = ctx.WriteString(response)
		})
	}

	for path, expected := range routes {
		var ctx fasthttp.RequestCtx
		ctx.Request.Header.SetMethod("GET")
		ctx.Request.SetRequestURI(path)

		r.Handler()(&ctx)

		if string(ctx.Response.Body()) != expected {
			t.Errorf("路径 %s 响应体 = %q, want %q", path, string(ctx.Response.Body()), expected)
		}
	}
}

// TestRouterPUT 测试 PUT 路由注册。
func TestRouterPUT(t *testing.T) {
	r := NewRouter()

	var called bool
	r.PUT("/update", func(ctx *fasthttp.RequestCtx) {
		called = true
		_, _ = ctx.WriteString("PUT response")
	})

	var ctx fasthttp.RequestCtx
	ctx.Request.Header.SetMethod("PUT")
	ctx.Request.SetRequestURI("/update")

	r.Handler()(&ctx)

	if !called {
		t.Error("PUT handler 未被调用")
	}
}

// TestRouterDELETE 测试 DELETE 路由注册。
func TestRouterDELETE(t *testing.T) {
	r := NewRouter()

	var called bool
	r.DELETE("/remove", func(ctx *fasthttp.RequestCtx) {
		called = true
		_, _ = ctx.WriteString("DELETE response")
	})

	var ctx fasthttp.RequestCtx
	ctx.Request.Header.SetMethod("DELETE")
	ctx.Request.SetRequestURI("/remove")

	r.Handler()(&ctx)

	if !called {
		t.Error("DELETE handler 未被调用")
	}
}

// TestRouterHEAD 测试 HEAD 路由注册。
func TestRouterHEAD(t *testing.T) {
	r := NewRouter()

	var called bool
	r.HEAD("/info", func(ctx *fasthttp.RequestCtx) {
		called = true
		ctx.Response.Header.Set("Content-Length", "100")
	})

	var ctx fasthttp.RequestCtx
	ctx.Request.Header.SetMethod("HEAD")
	ctx.Request.SetRequestURI("/info")

	r.Handler()(&ctx)

	if !called {
		t.Error("HEAD handler 未被调用")
	}
}

// TestRouterNotFound 测试未匹配路由的处理。
func TestRouterNotFound(t *testing.T) {
	r := NewRouter()

	r.GET("/exists", func(ctx *fasthttp.RequestCtx) {
		_, _ = ctx.WriteString("found")
	})

	var ctx fasthttp.RequestCtx
	ctx.Request.Header.SetMethod("GET")
	ctx.Request.SetRequestURI("/notexists")

	r.Handler()(&ctx)

	if ctx.Response.StatusCode() != fasthttp.StatusNotFound {
		t.Errorf("状态码 = %d, want %d", ctx.Response.StatusCode(), fasthttp.StatusNotFound)
	}
}
