package context

import (
	"rpirelay/internal/response"

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

type C struct {
	*gin.Context
}

type CustomHandler func(c *C)

func PatchContext(handler CustomHandler) gin.HandlerFunc {
	return func(ctx *gin.Context) {
		c := &C{
			Context: ctx,
		}
		handler(c)
	}
}

// Success
// send success body to client
func (c *C) Success(i ...interface{}) {
	r := response.Get(response.RespSuccess)

	var resp interface{} = r.Body
	if len(i) > 0 {
		resp = i[0]
	}

	c.AbortWithStatusJSON(r.Status, resp)
}

func (c *C) DataFormat(code ...response.MessageCode) {
	r := response.Get(response.RespDataFormat, code...)
	c.AbortWithStatusJSON(r.Status, r.Body)
}

func (c *C) NotFound(code ...response.MessageCode) {
	r := response.Get(response.RespNotFound, code...)
	c.AbortWithStatusJSON(r.Status, r.Body)
}

func (c *C) Forbidden(code ...response.MessageCode) {
	r := response.Get(response.RespNotFound, code...)
	c.AbortWithStatusJSON(r.Status, r.Body)
}

func (c *C) ServerError(code ...response.MessageCode) {
	r := response.Get(response.RespInternalError, code...)
	c.AbortWithStatusJSON(r.Status, r.Body)
}

func (c *C) CustomResp(rt response.RespType, code response.MessageCode, data ...interface{}) {
	r := response.Get(rt)

	if code != r.Body.MessageCode {
		r.Body.MessageCode, r.Body.Message = response.GetCodeMessage(code)
	}

	var resp interface{} = r.Body
	if len(data) > 0 {
		resp = data[0]
	}

	c.AbortWithStatusJSON(r.Status, resp)
}
