package utils

import (
	"net/http"

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

type Response struct {
	Status     bool        `json:"status"`
	StatusCode int         `json:"statusCode"`
	Message    string      `json:"message"`
	Data       interface{} `json:"data,omitempty"`
	Errors     interface{} `json:"errors,omitempty"`
}

func JSON(
	c *gin.Context,
	statusCode int,
	status bool,
	message string,
	data interface{},
	errors interface{},
) {
	c.JSON(statusCode, Response{
		Status:     status,
		StatusCode: statusCode,
		Message:    message,
		Data:       data,
		Errors:     errors,
	})
}

func Success(c *gin.Context, message string, data interface{}) {
	JSON(
		c,
		http.StatusOK,
		true,
		message,
		data,
		nil,
	)
}

func Created(c *gin.Context, message string, data interface{}) {
	JSON(
		c,
		http.StatusCreated,
		true,
		message,
		data,
		nil,
	)
}

func Updated(c *gin.Context, message string, data interface{}) {
	JSON(
		c,
		http.StatusOK,
		true,
		message,
		data,
		nil,
	)
}

func Deleted(c *gin.Context, message string) {
	JSON(
		c,
		http.StatusOK,
		true,
		message,
		nil,
		nil,
	)
}

func BadRequest(c *gin.Context, message string) {
	JSON(
		c,
		http.StatusBadRequest,
		false,
		message,
		nil,
		nil,
	)
}

func ValidationError(c *gin.Context, errors interface{}) {
	JSON(
		c,
		http.StatusBadRequest,
		false,
		"Validation failed",
		nil,
		errors,
	)
}

func Unauthorized(c *gin.Context, message string) {
	JSON(
		c,
		http.StatusUnauthorized,
		false,
		message,
		nil,
		nil,
	)
}

func Forbidden(c *gin.Context, message string) {
	JSON(
		c,
		http.StatusForbidden,
		false,
		message,
		nil,
		nil,
	)
}

func NotFound(c *gin.Context, message string) {
	JSON(
		c,
		http.StatusNotFound,
		false,
		message,
		nil,
		nil,
	)
}

func Conflict(c *gin.Context, message string) {
	JSON(
		c,
		http.StatusConflict,
		false,
		message,
		nil,
		nil,
	)
}

func InternalServerError(c *gin.Context, err error) {

	msg := "Internal server error"

	if err != nil {
		msg = err.Error()
	}

	JSON(
		c,
		http.StatusInternalServerError,
		false,
		msg,
		nil,
		nil,
	)
}
