package routes

import (
	"github.com/gofiber/fiber/v2"

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

// RegisterRoutes 路由注册总入口
// 按业务模块调用各自的路由注册函数
func RegisterRoutes(app *fiber.App, handlers *bootstrap.Handlers, middlewares *bootstrap.Middlewares) {
	RegisterRoutesWithDoc(app, handlers, middlewares, nil)
}

// RegisterRoutesWithDoc 路由注册总入口（支持文档生成）
func RegisterRoutesWithDoc(app *fiber.App, handlers *bootstrap.Handlers, middlewares *bootstrap.Middlewares, doc *openapi.Generator) {
	// 1. 全局路由
	registerHealthRoutes(app, doc)

	// 2. 统一认证路由 (挂载在 /api/auth)
	if handlers.Auth != nil {
		authGroup := app.Group("/api/auth")
		RegisterAuthRoutes(authGroup, handlers.Auth, middlewares.AdminAuth, doc, "/api/auth")
	}

	// 3. Admin 域 (挂载在 /api/admin)
	adminGroup := app.Group("/api/admin")
	RegisterAdminRoutes(adminGroup, handlers, middlewares, doc, "/api/admin")

	// 4. 个人客户路由 (挂载在 /api/c/v1)
	personalGroup := app.Group("/api/c/v1")
	RegisterPersonalCustomerRoutes(personalGroup, doc, "/api/c/v1", handlers, middlewares.PersonalAuth)

	// 5. 代理开放接口路由 (挂载在 /api/open/v1)
	if handlers.AgentOpenAPI != nil {
		openGroup := app.Group("/api/open/v1")
		if middlewares.AgentOpenAPIAuth != nil {
			openGroup = app.Group("/api/open/v1", middlewares.AgentOpenAPIAuth)
		}
		RegisterOpenAPIRoutes(openGroup, handlers.AgentOpenAPI, doc, "/api/open/v1")
	}

	// 6. 支付回调路由 (挂载在 /api/callback，无需认证)
	if handlers.PaymentCallback != nil {
		callbackGroup := app.Group("/api/callback")
		registerPaymentCallbackRoutes(callbackGroup, handlers.PaymentCallback, doc, "/api/callback")
	}
	if handlers.CTCCRealnameCallback != nil {
		callbackGroup := app.Group("/api/callback")
		registerCarrierCallbackRoutes(callbackGroup, handlers.CTCCRealnameCallback, doc, "/api/callback")
	}
	if handlers.CMCCRealnameCallback != nil {
		callbackGroup := app.Group("/api/callback")
		registerCMCCCallbackRoutes(callbackGroup, handlers.CMCCRealnameCallback, doc, "/api/callback")
	}
	if handlers.CUCCRealnameCallback != nil {
		callbackGroup := app.Group("/api/callback")
		registerCUCCRealnameCallbackRoutes(callbackGroup, handlers.CUCCRealnameCallback, doc, "/api/callback")
	}
	if handlers.CUCCRealnameRemovalCallback != nil {
		callbackGroup := app.Group("/api/callback")
		registerCUCCCallbackRoutes(callbackGroup, handlers.CUCCRealnameRemovalCallback, doc, "/api/callback")
	}
	if handlers.WeComApprovalCallback != nil {
		callbackGroup := app.Group("/api/callback")
		registerWeComApprovalCallbackRoutes(callbackGroup, handlers.WeComApprovalCallback, doc, "/api/callback")
	}
}
