package rest

import (
	"net/http"

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

// Flow Interview Management (sObject API compatible)

// ListInterviews handles GET /services/data/v63.0/sobjects/FlowInterview
// Returns list of paused/running flow interviews
func (h *FlowHandler) ListInterviews(c *gin.Context) {
	user := MustGetUser(c)

	ctx := c.Request.Context()

	interviews, err := h.interviews.ListInterviews(ctx, user)
	if err != nil {
		RespondAppError(c, apierr.Internal(err))
		return
	}

	c.JSON(http.StatusOK, gin.H{
		"totalSize": len(interviews),
		"done":      true,
		"records":   interviews,
	})
}

// GetInterview handles GET /services/data/v63.0/sobjects/FlowInterview/:id
// Returns a specific flow interview
func (h *FlowHandler) GetInterview(c *gin.Context) {
	interviewId := c.Param("id")
	user := MustGetUser(c)

	ctx := c.Request.Context()

	interview, err := h.interviews.GetInterview(ctx, interviewId, user)
	if err != nil {
		RespondAppError(c, apierr.Internal(err))
		return
	}
	if interview == nil {
		RespondAppError(c, apierr.NotFound("FlowInterview"))
		return
	}

	c.JSON(http.StatusOK, interview)
}

// DeleteInterview handles DELETE /services/data/v63.0/sobjects/FlowInterview/:id
// Deletes a paused flow interview
func (h *FlowHandler) DeleteInterview(c *gin.Context) {
	interviewId := c.Param("id")
	user := MustGetUser(c)

	ctx := c.Request.Context()

	if err := h.interviews.DeleteInterview(ctx, interviewId, user); err != nil {
		RespondAppError(c, apierr.Internal(err))
		return
	}

	c.Status(http.StatusNoContent)
}

// ResumeInterview handles POST /services/data/v63.0/actions/custom/resumeFlow
// Resumes a paused flow interview
func (h *FlowHandler) ResumeInterview(c *gin.Context) {
	user := MustGetUser(c)

	var req struct {
		InterviewId string `json:"interviewId" binding:"required"`
	}
	if !BindJSON(c, &req) {
		return
	}

	ctx := c.Request.Context()

	if err := h.executor.ResumeInterview(ctx, req.InterviewId, user); err != nil {
		RespondAppError(c, apierr.Internal(err))
		return
	}

	c.JSON(http.StatusOK, gin.H{
		"success": true,
	})
}
