package rest

import (
	"net/http"

	"github.com/gin-gonic/gin"
	"github.com/nexuscrm/backend/internal/application/services"
	"github.com/nexuscrm/shared/pkg/models"
)

// ToolingValidationHandler provides Tooling API sObject shims for ValidationRule,
// delegating to the existing MetadataService validation rule CRUD.
type ToolingValidationHandler struct {
	svc *services.ServiceManager
}

func NewToolingValidationHandler(svc *services.ServiceManager) *ToolingValidationHandler {
	return &ToolingValidationHandler{svc: svc}
}

// CreateValidationRule handles POST /tooling/sobjects/ValidationRule
func (h *ToolingValidationHandler) CreateValidationRule(c *gin.Context) {
	MustGetUser(c)

	var rule models.ValidationRule
	if !BindJSON(c, &rule) {
		return
	}

	if err := h.svc.Metadata.CreateValidationRule(c.Request.Context(), &rule); err != nil {
		RespondAppError(c, err)
		return
	}

	c.JSON(http.StatusCreated, gin.H{
		"id":      rule.ID,
		"success": true,
		"errors":  []interface{}{},
	})
}

// UpdateValidationRule handles PATCH /tooling/sobjects/ValidationRule/:id
func (h *ToolingValidationHandler) UpdateValidationRule(c *gin.Context) {
	MustGetUser(c)

	id := c.Param("id")
	var updates models.ValidationRule
	if !BindJSON(c, &updates) {
		return
	}

	if err := h.svc.Metadata.UpdateValidationRule(c.Request.Context(), id, &updates); err != nil {
		RespondAppError(c, err)
		return
	}

	c.Status(http.StatusNoContent)
}

// DeleteValidationRule handles DELETE /tooling/sobjects/ValidationRule/:id
func (h *ToolingValidationHandler) DeleteValidationRule(c *gin.Context) {
	MustGetUser(c)

	id := c.Param("id")
	if err := h.svc.Metadata.DeleteValidationRule(c.Request.Context(), id); err != nil {
		RespondAppError(c, err)
		return
	}

	c.Status(http.StatusNoContent)
}
