package rest

import (
	"net/http"

	"github.com/gin-gonic/gin"
	"github.com/nexuscrm/backend/internal/features/records"
	"github.com/nexuscrm/backend/pkg/apierr"
)

type CompositeTreeHandler struct {
	persistenceSvc *records.PersistenceService
}

func NewCompositeTreeHandler(persistenceSvc *records.PersistenceService) *CompositeTreeHandler {
	return &CompositeTreeHandler{
		persistenceSvc: persistenceSvc,
	}
}

// HandleTreeCreate handles POST /composite/tree/{ObjectName}
func (h *CompositeTreeHandler) HandleTreeCreate(c *gin.Context) {
	objectName := c.Param("objectName")

	var req struct {
		Records []map[string]interface{} `json:"records"`
	}
	// Salesforce Tree API body format: { "records": [ ... ] }

	if err := c.ShouldBindJSON(&req); err != nil {
		c.JSON(http.StatusBadRequest, apierr.SFErrorResponse(apierr.SFCodeInvalidRequest, "Invalid request body"))
		return
	}

	if len(req.Records) > 200 {
		c.JSON(http.StatusBadRequest, apierr.SFErrorResponse(apierr.SFCodeLimitExceeded, "Maximum 200 records allowed"))
		return
	}

	user := MustGetUser(c)
	results, err := h.persistenceSvc.CreateTree(c.Request.Context(), objectName, req.Records, user)
	if err != nil {
		c.JSON(http.StatusBadRequest, apierr.SFErrorResponse(apierr.SFCodeInvalidRequest, err.Error()))
		return
	}

	c.JSON(http.StatusCreated, gin.H{
		"hasErrors": false,
		"results":   results,
	})
}
