package rest

import (
	"net/http"
	"strings"

	"github.com/gin-gonic/gin"
	"github.com/nexuscrm/backend/internal/features/mru"
	"github.com/nexuscrm/backend/pkg/apierr"
	"github.com/rs/zerolog/log"
)

// RelevantItemsHandler handles /sobjects/relevantItems endpoint
type RelevantItemsHandler struct {
	mruService *mru.Service
}

// NewRelevantItemsHandler creates a new RelevantItemsHandler
func NewRelevantItemsHandler(mruService *mru.Service) *RelevantItemsHandler {
	return &RelevantItemsHandler{mruService: mruService}
}

// GetRelevantItems handles GET /services/data/vXX.X/sobjects/relevantItems
// Returns the user's most recently used records as a flat array (Salesforce v63.0 compatible)
//
// @Summary      Get Relevant Items
// @Description  Returns the most recently used records for the logged-in user (Salesforce v63.0 format)
// @Tags         sobjects
// @Produce      json
// @Param        sobjects query string false "Comma-separated list of object API names to filter"
// @Param        lastUpdatedId query string false "Compare to previous version for delta queries"
// @Success      200  {array}  mru.RelevantItem
// @Failure      401  {object}  map[string]interface{}
// @Router       /sobjects/relevantItems [get]
// @Security     BearerAuth
func (h *RelevantItemsHandler) GetRelevantItems(c *gin.Context) {
	user := MustGetUser(c)

	// Extract API version from path (e.g., "v63.0")
	apiVersion := c.Param("version")
	if apiVersion == "" {
		apiVersion = "v63.0"
	}

	// Parse query parameters
	sobjectsParam := c.Query("sobjects")
	lastUpdatedID := c.Query("lastUpdatedId")

	// Parse sobjects filter
	var sobjects []string
	if sobjectsParam != "" {
		for _, obj := range strings.Split(sobjectsParam, ",") {
			obj = strings.TrimSpace(obj)
			if obj != "" {
				sobjects = append(sobjects, obj)
			}
		}
	}

	// Get relevant items (Salesforce v63.0 flat array format)
	result, newLastUpdatedID, err := h.mruService.GetRelevantItems(
		c.Request.Context(),
		user.ID,
		sobjects,
		lastUpdatedID,
		apiVersion,
	)

	if err != nil {
		log.Error().Err(err).Str("userId", user.ID).Msg("Failed to retrieve relevant items")
		c.JSON(http.StatusInternalServerError, apierr.SFErrorResponse(apierr.SFCodeInternalError, "Failed to retrieve relevant items"))
		return
	}

	// Set response headers for delta queries (Salesforce-compatible)
	c.Header("lastUpdatedId", newLastUpdatedID)
	if lastUpdatedID != "" && lastUpdatedID != newLastUpdatedID {
		c.Header("newResultSetSinceLastQuery", "true")
	}

	// Return flat array directly (Salesforce v63.0 format)
	c.JSON(http.StatusOK, result)
}
