package rest

import (
	"github.com/gin-gonic/gin"
	"github.com/nexuscrm/backend/internal/domain/ports"
	"github.com/nexuscrm/backend/internal/features/metadata"
	"github.com/nexuscrm/backend/internal/features/permissions"
	"github.com/nexuscrm/backend/internal/features/records"
)

// BulkHandler handles Bulk API routes.
// Method implementations are split across domain-specific files:
//   - bulk_ingest.go — CreateJob, GetJob, CloseJob, UploadData
//   - bulk_query.go  — CreateQueryJob, GetQueryJob, GetQueryResults
type BulkHandler struct {
	bulkSvc        *records.BulkService
	persistenceSvc *records.PersistenceService
	metadataSvc    *metadata.MetadataService
	permissionSvc  *permissions.PermissionService
	eventBus       ports.EventPublisher
	querySvc       ports.QueryService
}

// NewBulkHandler creates a new BulkHandler
func NewBulkHandler(
	bulkSvc *records.BulkService,
	persistenceSvc *records.PersistenceService,
	metadataSvc *metadata.MetadataService,
	permissionSvc *permissions.PermissionService,
	eventBus ports.EventPublisher,
	querySvc ports.QueryService,
) *BulkHandler {
	return &BulkHandler{
		bulkSvc:        bulkSvc,
		persistenceSvc: persistenceSvc,
		metadataSvc:    metadataSvc,
		permissionSvc:  permissionSvc,
		eventBus:       eventBus,
		querySvc:       querySvc,
	}
}

// RegisterRoutes registers bulk API routes
func (h *BulkHandler) RegisterRoutes(group *gin.RouterGroup) {
	group.POST("/ingest", h.CreateJob)
	group.GET("/ingest/:jobId", h.GetJob)
	group.PATCH("/ingest/:jobId", h.CloseJob)
	group.PUT("/ingest/:jobId/batches", h.UploadData)

	group.POST("/query", h.CreateQueryJob)
	group.GET("/query/:jobId", h.GetQueryJob)
	group.GET("/query/:jobId/results", h.GetQueryResults)
}
