package routes

import (
	"regexp"

	"github.com/gofiber/fiber/v2"

	"github.com/break/junhong_cmp_fiber/pkg/openapi"
)

// FileUploadField 定义文件上传字段
type FileUploadField struct {
	Name        string // 字段名
	Description string // 字段描述
	Required    bool   // 是否必填
}

// RouteSpec 定义接口文档元数据
type RouteSpec struct {
	Summary        string            // 简短摘要（中文，一行）
	Description    string            // 详细说明，支持 Markdown 语法（可选）
	Input          interface{}       // 请求参数结构体 (Query/Path/Body)
	Body           interface{}       // 显式 JSON 请求体（用于 DELETE 等方法，库不自动生成 requestBody 的场景）
	Output         interface{}       // 响应参数结构体
	Tags           []string          // 分类标签
	Auth           bool              // 是否需要认证响应和认证标记
	SecurityScheme string            // OpenAPI 认证方案，空值表示 BearerAuth
	FileUploads    []FileUploadField // 文件上传字段列表（设置此字段时请求类型为 multipart/form-data）
}

// pathParamRegex 用于匹配 Fiber 的路径参数格式 /:param
var pathParamRegex = regexp.MustCompile(`/:([a-zA-Z0-9_]+)`)

// Register 封装后的注册函数
// router: Fiber 路由组
// doc: 文档生成器 (如果在运行 Web 服务时为 nil，在生成文档时为非 nil)
// basePath: 当前路由组的基础路径 (用于文档生成)
// method, path: HTTP 方法和路径
// handler: Fiber Handler
// spec: 文档元数据
func Register(router fiber.Router, doc *openapi.Generator, basePath, method, path string, handler fiber.Handler, spec RouteSpec) {
	router.Add(method, path, handler)

	if doc != nil {
		fullPath := basePath + path
		openapiPath := pathParamRegex.ReplaceAllString(fullPath, "/{$1}")

		if len(spec.FileUploads) > 0 {
			fileFields := make([]openapi.FileUploadField, len(spec.FileUploads))
			for i, f := range spec.FileUploads {
				fileFields[i] = openapi.FileUploadField{
					Name:        f.Name,
					Description: f.Description,
					Required:    f.Required,
				}
			}
			doc.AddMultipartOperation(method, openapiPath, spec.Summary, spec.Description, spec.Input, spec.Output, spec.Auth, fileFields, spec.Tags...)
		} else {
			doc.AddOperationWithSecurity(method, openapiPath, spec.Summary, spec.Description, spec.Input, spec.Body, spec.Output, spec.Auth, spec.SecurityScheme, spec.Tags...)
		}
	}
}
