package controllers

import (
	"net/http"

	"github.com/gin-gonic/gin"
)

// ResponseHelper provides standardized API response methods
type ResponseHelper struct{}

// Response represents a standard API response
type Response struct {
	Success bool        `json:"success"`
	Message string      `json:"message,omitempty"`
	Data    interface{} `json:"data,omitempty"`
	Error   string      `json:"error,omitempty"`
	Meta    interface{} `json:"meta,omitempty"`
}

// NewResponseHelper creates a new ResponseHelper instance
func NewResponseHelper() *ResponseHelper {
	return &ResponseHelper{}
}

// Success sends a successful response
func (rh *ResponseHelper) Success(c *gin.Context, data interface{}, message string) {
	c.JSON(http.StatusOK, Response{
		Success: true,
		Message: message,
		Data:    data,
	})
}

// SuccessWithMeta sends a successful response with metadata (e.g., pagination)
func (rh *ResponseHelper) SuccessWithMeta(c *gin.Context, data interface{}, meta interface{}, message string) {
	c.JSON(http.StatusOK, Response{
		Success: true,
		Message: message,
		Data:    data,
		Meta:    meta,
	})
}

// Created sends a 201 Created response
func (rh *ResponseHelper) Created(c *gin.Context, data interface{}, message string) {
	c.JSON(http.StatusCreated, Response{
		Success: true,
		Message: message,
		Data:    data,
	})
}

// NoContent sends a 204 No Content response
func (rh *ResponseHelper) NoContent(c *gin.Context) {
	c.Status(http.StatusNoContent)
}

// BadRequest sends a 400 Bad Request response
func (rh *ResponseHelper) BadRequest(c *gin.Context, message string) {
	c.JSON(http.StatusBadRequest, Response{
		Success: false,
		Error:   message,
	})
}

// Unauthorized sends a 401 Unauthorized response
func (rh *ResponseHelper) Unauthorized(c *gin.Context, message string) {
	c.JSON(http.StatusUnauthorized, Response{
		Success: false,
		Error:   message,
	})
}

// Forbidden sends a 403 Forbidden response
func (rh *ResponseHelper) Forbidden(c *gin.Context, message string) {
	c.JSON(http.StatusForbidden, Response{
		Success: false,
		Error:   message,
	})
}

// NotFound sends a 404 Not Found response
func (rh *ResponseHelper) NotFound(c *gin.Context, message string) {
	c.JSON(http.StatusNotFound, Response{
		Success: false,
		Error:   message,
	})
}

// Conflict sends a 409 Conflict response
func (rh *ResponseHelper) Conflict(c *gin.Context, message string) {
	c.JSON(http.StatusConflict, Response{
		Success: false,
		Error:   message,
	})
}

// InternalError sends a 500 Internal Server Error response
func (rh *ResponseHelper) InternalError(c *gin.Context, message string) {
	c.JSON(http.StatusInternalServerError, Response{
		Success: false,
		Error:   message,
	})
}

// ValidationError sends a 422 Unprocessable Entity response
func (rh *ResponseHelper) ValidationError(c *gin.Context, errors interface{}) {
	c.JSON(http.StatusUnprocessableEntity, Response{
		Success: false,
		Error:   "Validation failed",
		Data:    errors,
	})
}

// Custom sends a custom status code response
func (rh *ResponseHelper) Custom(c *gin.Context, statusCode int, success bool, data interface{}, message string, errMsg string) {
	response := Response{
		Success: success,
		Data:    data,
	}
	if message != "" {
		response.Message = message
	}
	if errMsg != "" {
		response.Error = errMsg
	}
	c.JSON(statusCode, response)
}

// Global ResponseHelper instance for convenience
var Respond = NewResponseHelper()
