package rest

import (
	"strings"

	"github.com/gin-gonic/gin"
	appErrors "github.com/nexuscrm/backend/pkg/errors"
	"github.com/nexuscrm/shared/pkg/models"
)

// --- Validation Rule Handlers ---

// CreateValidationRule godoc
// @Summary      Create Validation Rule
// @Description  Create a new validation rule for an object.
// @Tags         metadata
// @Accept       json
// @Produce      json
// @Param        rule body models.ValidationRule true "Validation Rule"
// @Success      201  {object}  models.ValidationRule
// @Failure      400  {object}  map[string]interface{}
// @Router       /metadata/validation-rules [post]
// @Security     BearerAuth
func (h *MetadataHandler) CreateValidationRule(c *gin.Context) {
	// requireSystemAdmin handled by middleware

	var rule models.ValidationRule
	if err := c.ShouldBindJSON(&rule); err != nil {
		RespondAppError(c, appErrors.NewValidationError("body", err.Error()))
		return
	}

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

// UpdateValidationRule godoc
// @Summary      Update Validation Rule
// @Description  Update an existing validation rule.
// @Tags         metadata
// @Accept       json
// @Produce      json
// @Param        id path string true "Rule ID"
// @Param        updates body models.ValidationRule true "Rule Updates"
// @Success      200  {object}  models.ValidationRule
// @Failure      400  {object}  map[string]interface{}
// @Router       /metadata/validation-rules/{id} [patch]
// @Security     BearerAuth
func (h *MetadataHandler) UpdateValidationRule(c *gin.Context) {
	// requireSystemAdmin handled by middleware

	id := c.Param("id")
	var updates models.ValidationRule
	if err := c.ShouldBindJSON(&updates); err != nil {
		RespondAppError(c, appErrors.NewValidationError("body", err.Error()))
		return
	}

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

// DeleteValidationRule godoc
// @Summary      Delete Validation Rule
// @Description  Delete a validation rule.
// @Tags         metadata
// @Accept       json
// @Produce      json
// @Param        id path string true "Rule ID"
// @Success      204  "No Content"
// @Failure      400  {object}  map[string]interface{}
// @Router       /metadata/validation-rules/{id} [delete]
// @Security     BearerAuth
func (h *MetadataHandler) DeleteValidationRule(c *gin.Context) {
	// requireSystemAdmin handled by middleware

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

// GetValidationRules godoc
// @Summary      Get Validation Rules
// @Description  List validation rules for an object.
// @Tags         metadata
// @Accept       json
// @Produce      json
// @Param        objectApiName query string true "Object API Name"
// @Success      200  {object}  map[string]interface{} "Wrapped list of rules"
// @Failure      400  {object}  map[string]interface{}
// @Router       /metadata/validation-rules [get]
// @Security     BearerAuth
func (h *MetadataHandler) GetValidationRules(c *gin.Context) {
	objectAPIName := strings.ToLower(c.Query("objectApiName"))
	if objectAPIName == "" {
		RespondAppError(c, appErrors.NewValidationError("objectApiName", "is required"))
		return
	}
	rules := h.svc.Metadata.GetValidationRules(c.Request.Context(), objectAPIName)
	c.JSON(200, map[string]interface{}{"rules": rules})
}
