package e

import (
	"net/http"

	"github.com/gin-gonic/gin"

	"applet/app/utils/logx"
)

// GetMsg get error information based on Code
// 因为这里code是自己控制的, 因此没考虑报错信息
func GetMsg(code int) (int, string) {
	if msg, ok := MsgFlags[code]; ok {
		return code / 1000, msg
	}
	if http.StatusText(code) == "" {
		code = 200
	}
	return code, MsgFlags[ERR_BAD_REQUEST]
}

// 成功输出, fields 是额外字段, 与code, msg同级
func OutSuc(c *gin.Context, data interface{}, fields map[string]interface{}) {
	res := gin.H{
		"code": 1,
		"msg":  "ok",
		"data": data,
	}
	if fields != nil {
		for k, v := range fields {
			res[k] = v
		}
	}

	c.AbortWithStatusJSON(200, res)
}

func OutSucPure(c *gin.Context, data interface{}, fields map[string]interface{}) {
	res := gin.H{
		"code": 1,
		"msg":  "ok",
		"data": data,
	}
	if fields != nil {
		for k, v := range fields {
			res[k] = v
		}
	}
	c.Abort()
	c.PureJSON(200, res)
}

// 错误输出
func OutErr(c *gin.Context, code int, err ...interface{}) {
	statusCode, msg := GetMsg(code)
	if len(err) > 0 && err[0] != nil {
		e := err[0]
		switch v := e.(type) {
		case E:
			statusCode = v.Code / 1000
			msg = v.Error()
			logx.Error(v.msg + ": " + v.st) // 记录堆栈信息
		case error:
			logx.Error(v)
			break
		case string:
			msg = v
		case int:
			if _, ok := MsgFlags[v]; ok {
				msg = MsgFlags[v]
			}
		}
	}

	c.AbortWithStatusJSON(statusCode, gin.H{
		"code": code,
		"msg":  msg,
		"data": []struct{}{},
	})
}

// 重定向
func OutRedirect(c *gin.Context, code int, loc string) {
	if code < 301 || code > 308 {
		code = 303
	}
	c.Redirect(code, loc)
	c.Abort()
}