package handler

import "github.com/gin-gonic/gin"

type Module struct {
	Vulnerabilities   *Handler
	Tags              *TagHandler
	Types             *VulnerabilityTypeHandler
	Sources           *SourceHandler
	DiscoveryChannels *DiscoveryChannelHandler
}

func NewModule(
	vulnerabilities *Handler,
	tags *TagHandler,
	types *VulnerabilityTypeHandler,
	sources *SourceHandler,
	discoveryChannels *DiscoveryChannelHandler,
) *Module {
	return &Module{
		Vulnerabilities:   vulnerabilities,
		Tags:              tags,
		Types:             types,
		Sources:           sources,
		DiscoveryChannels: discoveryChannels,
	}
}

func (m *Module) RegisterRoutes(protected *gin.RouterGroup, requirePermission func(string) gin.HandlerFunc) {
	if m == nil || protected == nil {
		return
	}

	if m.Vulnerabilities != nil {
		m.Vulnerabilities.RegisterAuthorizedViewerCandidateRoutes(protected.Group(""))
		m.Vulnerabilities.RegisterPublicVisibilityRoutes(protected.Group(""))

		vulnGroup := protected.Group("")
		if requirePermission != nil {
			vulnGroup.Use(requirePermission("vuln:view_findings"))
		}
		m.Vulnerabilities.RegisterRestrictedRoutes(vulnGroup)

		// 提交漏洞独立子组: 门槛为 vuln:submit_findings(人走角色权限, agent 为 Key scope),
		// 与 view 组平级, 保证 POST /vulnerabilities 恰好注册一次。
		submitGroup := protected.Group("")
		if requirePermission != nil {
			submitGroup.Use(requirePermission("vuln:submit_findings"))
		}
		m.Vulnerabilities.RegisterSubmitRoutes(submitGroup)
	}

	registerManagedLookupRoutes := func(
		path string,
		register func(view *gin.RouterGroup, manage *gin.RouterGroup),
	) {
		if register == nil {
			return
		}
		viewGroup := protected.Group(path)
		var manageGroup *gin.RouterGroup
		if requirePermission != nil {
			manageGroup = viewGroup.Group("")
			manageGroup.Use(requirePermission("vuln:manage_findings"))
		} else {
			manageGroup = viewGroup
		}
		register(viewGroup, manageGroup)
	}

	if m.Tags != nil {
		registerManagedLookupRoutes("/vulnerability-tags", m.Tags.RegisterRoutes)
	}
	if m.Types != nil {
		registerManagedLookupRoutes("/vulnerability-types", m.Types.RegisterRoutes)
	}
	if m.Sources != nil {
		registerManagedLookupRoutes("/vulnerability-sources", m.Sources.RegisterRoutes)
	}
	if m.DiscoveryChannels != nil {
		registerManagedLookupRoutes("/vulnerability-discovery-channels", m.DiscoveryChannels.RegisterRoutes)
	}
}
