// Package router ...
//
// Description : router ...
//
// Author : go_developer@163.com<白茶清欢>
//
// Date : 2025-05-28 20:58
package router

import (
	"testing"
	"time"

	"git.zhangdeman.cn/zhangdeman/rate_limit"
	"github.com/gin-gonic/gin"
)

func TestNewServer(t *testing.T) {

	s := NewServer(9087, WithRateLimitInstance(rate_limit.MemoryClient), WithDocConfig(&DocConfig{
		Enable:          true,
		UiTheme:         "elements",
		BaseUri:         "",
		Flag:            "test-server",
		ServerList:      nil,
		Info:            nil,
		SecuritySchemes: nil,
		CommonParameter: nil,
	}))
	s.AddCommonParamRule("UserID", func(ctx *gin.Context) (any, error) {
		return uint(123456), nil
	})
	s.Group("", nil, testController{})
	s.Start()
}

type testCategory struct {
	Meta `json:"-" method:"get" path:"test" rate-limit:"1/5/60" tag:"测试,验证" summary:"本地调试"`
	ID   int64  `json:"id" description:"分类ID" eg:"123" binding:"required,min=10,max=100"`
	Sex  string `json:"sex" dc:"性别" binding:"required,oneof=man woman" enum-desc:"man:男||woman:女"`
	Name string `json:"name" description:"分类名称" eg:"baichaqinghuan" binding:"required,min=8"`
}
type testProduct struct {
	ID         int64             `json:"id,omitempty" description:"产品ID" example:"1001" required:"true" binding:"required"`
	Name       string            `json:"name" description:"产品名称" example:"iPhone 13" minLength:"2" maxLength:"100" required:"true"`
	Price      float64           `json:"price" description:"价格" example:"6999.99" min:"0"`
	Stock      int               `json:"stock" description:"库存" example:"100" min:"0"`
	Tags       []string          `json:"tags" description:"标签"`
	Attributes map[string]string `json:"attributes" description:"属性"`
	CreatedAt  time.Time         `json:"created_at" description:"创建时间"`
	UpdatedAt  *time.Time        `json:"updated_at,omitempty" description:"更新时间"`
	Category   *testCategory     `json:"category,omitempty" description:"分类"`
}

type testController struct {
}

func (tc testController) Test(ctx *gin.Context, requestData *testCategory) (*testProduct, error) {
	return &testProduct{}, nil
}
