package rest

import (
	"github.com/gin-gonic/gin"
	"github.com/nexuscrm/backend/internal/application/services"
	"github.com/nexuscrm/backend/internal/features/permissions"
)

// ReportFolder is the unified folder table used by both Reports and Dashboards
const folderTableName = "ReportFolder"
const folderShareTableName = "FolderShare"

// Query limits
const maxQueryLimit = 10000 // Maximum records fetched per query
const maxSharesLimit = 1000 // Maximum shares per folder
const maxPageSize = 2000    // Maximum page size per Salesforce API
const defaultPageSize = 200 // Default page size

// FolderHandler handles Analytics Folders API requests.
// Method implementations are split across domain-specific files:
//   - folder_helpers.go — response types, normalizers, pagination, validation helpers
//   - folder_crud.go    — ListFolders, GetFolder, GetFolderChildren, CreateFolder, UpdateFolder, DeleteFolder
//   - folder_shares.go  — GetFolderShares, AddFolderShares, UpdateFolderShares, GetFolderShare, UpdateFolderShare, DeleteFolderShare
type FolderHandler struct {
	svcMgr       *services.ServiceManager
	folderAccess *permissions.FolderAccessService
}

// NewFolderHandler creates a new FolderHandler
func NewFolderHandler(svcMgr *services.ServiceManager) *FolderHandler {
	h := &FolderHandler{svcMgr: svcMgr}
	if svcMgr != nil {
		h.folderAccess = svcMgr.FolderAccess
	}
	return h
}

// RegisterReadRoutes registers folder read routes (requires RunReports permission)
func (h *FolderHandler) RegisterReadRoutes(group *gin.RouterGroup) {
	group.GET("", h.ListFolders)
	group.GET("/:id", h.GetFolder)
	group.GET("/:id/children", h.GetFolderChildren)
	group.GET("/:id/shares", h.GetFolderShares)
	group.GET("/:id/shares/:shareId", h.GetFolderShare)
}

// RegisterWriteRoutes registers folder write routes (requires CustomizeApplication permission)
func (h *FolderHandler) RegisterWriteRoutes(group *gin.RouterGroup) {
	group.POST("", h.CreateFolder)
	group.PATCH("/:id", h.UpdateFolder)
	group.DELETE("/:id", h.DeleteFolder)
	// Share management (Salesforce: POST=add, PUT=replace)
	group.POST("/:id/shares", h.AddFolderShares)
	group.PUT("/:id/shares", h.UpdateFolderShares)
	group.PATCH("/:id/shares/:shareId", h.UpdateFolderShare)
	group.DELETE("/:id/shares/:shareId", h.DeleteFolderShare)
}

// RegisterAdminRoutes registers admin-only folder routes (requires SuperUser / IsSystemAdmin).
func (h *FolderHandler) RegisterAdminRoutes(group *gin.RouterGroup) {
	group.POST("/transfer-ownership", h.TransferOwnership)
}
