package errors

import "github.com/gogf/gf/net/ghttp"

// ResponseError 响应错误
type ResponseError struct {
	Code       int    // 错误码
	Message    string // 错误消息
	StatusCode int    // 响应错误码
	ERR        error  // 响应错误
}

func (r *ResponseError) Error() string {
	if r.ERR != nil {
		return r.ERR.Error()
	}
	return r.Message
}

// UnWrapResponse 解包响应错误
func UnWrapResponse(err error) *ResponseError {
	if v, ok := err.(*ResponseError); ok {
		return v
	}
	return nil
}

// WrapResponse 包装响应错误
func WrapResponse(err error, code int, msg string, status ...int) error {
	res := &ResponseError{
		Code:    code,
		Message: msg,
		ERR:     err,
	}
	if len(status) > 0 {
		res.StatusCode = status[0]
	}
	return res
}

// Wrap400Response 包装错误码为400的响应错误
func Wrap400Response(err error, msg ...string) error {
	m := "请求发生错误"
	if len(msg) > 0 {
		m = msg[0]
	}
	return WrapResponse(err, 400, m, 400)
}

// Wrap500Response 包装错误码为500的响应错误
func Wrap500Response(err error, msg ...string) error {
	m := "服务器发生错误"
	if len(msg) > 0 {
		m = msg[0]
	}
	return WrapResponse(err, 500, m, 500)
}

// NewResponse 创建响应错误
func NewResponse(code int, msg string, status ...int) error {
	res := &ResponseError{
		Code:    code,
		Message: msg,
	}
	if len(status) > 0 {
		res.StatusCode = status[0]
	}
	return res
}

// New400Response 创建错误码为400的响应错误
func New400Response(msg string) error {
	return NewResponse(400, msg, 400)
}

// New500Response 创建错误码为500的响应错误
func New500Response(msg string) error {
	return NewResponse(500, msg, 500)
}

func Json(r *ghttp.Request, code int, v interface{}) {
	if code == 500 || code == 401 {
		r.Response.WriteStatus(code)
		r.Response.ClearBuffer()
	}
	_ = r.Response.WriteJson(v)
}

// 返回JSON数据并退出当前HTTP执行函数。
func JsonExit(r *ghttp.Request, err int, data interface{}) {
	Json(r, err, data)
	r.Exit()
}
