package resp

import (
	"encoding/json"
	"fmt"
	"github.com/gin-gonic/gin"
	"hongze/hongze_yb_en_api/global"
	"hongze/hongze_yb_en_api/utils"
	"strings"
)

var (
	OK_CODE             = 200  //业务成功
	FAIL_CODE           = 400  //业务错误
	TOKEN_ERROR_CODE    = 401  //toke异常
	NO_AUTH             = 403  //没有权限
	SPECIFIC_FAIL_CODE  = 4001 // 业务指定错误
	HASFORBIDDEN_CODE   = 4010 // 管理员账号被禁用
	PASSWORDCHANGE_CODE = 4011 // 管理员账号被禁用
	EXPIRED_CODE        = 4012 // 已到期
	UNREGISTERED_CODE   = 4013 // 未注册
	UNBOUND_CODE        = 4014 // 未绑定
	REGISTERED_CODE     = 4015 // 已注册
	BOUND_CODE          = 4016 // 已绑定
)

type ResultData struct {
	Code   int         `json:"code" description:"状态码"`
	Msg    string      `json:"msg" description:"提示信息"`
	Data   interface{} `json:"data" description:"返回数据"`
	ErrMsg string      `json:"-" description:"错误信息,不用返回给前端,只是做日志记录"`
}

func result(code int, resultData ResultData, c *gin.Context) {
	jsonByte, _ := json.Marshal(resultData)
	token := c.Request.Header.Get("Authorization")
	if token == "" {
		token = c.DefaultQuery("authorization", "")
		if token == "" {
			token = c.DefaultQuery("Authorization", "")
		}
	}
	logSlice := make([]string, 0)
	logSlice = append(logSlice, fmt.Sprint("Url:", c.Request.RequestURI))
	logSlice = append(logSlice, fmt.Sprint("Token:", token))
	logSlice = append(logSlice, fmt.Sprint("resultData:", string(jsonByte)))

	//记录错误日志
	if resultData.ErrMsg != "" {
		logSlice = append(logSlice, fmt.Sprint("ErrMsg:", resultData.ErrMsg))
		global.LOG.Info(strings.Join(logSlice, ";"))
	}

	// 测试环境不加密
	if global.CONFIG.Serve.RunMode == "debug" {
		c.JSON(code, resultData)
	} else {
		global.LOG.Info(strings.Join(logSlice, ";"))
		encryptResult := utils.DesBase64Encrypt(jsonByte)
		c.JSON(code, string(encryptResult))
	}
	c.Abort()
}

// OK 操作成功
func Ok(msg string, c *gin.Context) {
	resultData := ResultData{
		Code: OK_CODE,
		Msg:  msg,
	}
	result(200, resultData, c)
}

// OkData 成功返回数据
func OkData(msg string, data interface{}, c *gin.Context) {
	resultData := ResultData{
		Code: OK_CODE,
		Msg:  msg,
		Data: data,
	}
	result(200, resultData, c)
}

// Fail 操作失败
func Fail(msg string, c *gin.Context) {
	resultData := ResultData{
		Code: FAIL_CODE,
		Msg:  msg,
	}
	result(200, resultData, c)
}

// FailData 成功返回数据
func FailData(msg string, data interface{}, c *gin.Context) {
	resultData := ResultData{
		Code: FAIL_CODE,
		Msg:  msg,
		Data: data,
	}
	result(200, resultData, c)
}

// Custom 自定义状态码+操作成功
func Custom(code int, msg string, c *gin.Context) {
	resultData := ResultData{
		Code: code,
		Msg:  msg,
	}
	result(200, resultData, c)
}

// CustomData 自定义状态码+返回数据
func CustomData(code int, msg string, data interface{}, c *gin.Context) {
	resultData := ResultData{
		Code: code,
		Msg:  msg,
		Data: data,
	}
	result(200, resultData, c)
}

// TokenError token异常
func TokenError(data interface{}, message, errMsg string, c *gin.Context) {
	resultData := ResultData{
		Code:   TOKEN_ERROR_CODE,
		Msg:    message,
		Data:   data,
		ErrMsg: errMsg,
	}
	result(200, resultData, c)
}

// AuthError 没有权限
func AuthError(data interface{}, message string, c *gin.Context) {
	resultData := ResultData{
		Code: NO_AUTH,
		Msg:  message,
		Data: data,
	}
	result(200, resultData, c)
}

// SpecificFail 业务指定错误
func SpecificFail(code int, data interface{}, message string, c *gin.Context) {
	resultData := ResultData{
		Code: code,
		Msg:  message,
		Data: data,
	}
	result(200, resultData, c)
}

// FailMsg 操作失败
func FailMsg(msg, errMsg string, c *gin.Context) {
	resultData := ResultData{
		Code:   FAIL_CODE,
		Msg:    msg,
		ErrMsg: errMsg,
	}
	result(200, resultData, c)
}

// Expired 过期
func Expired(msg string, c *gin.Context) {
	resultData := ResultData{
		Code: EXPIRED_CODE,
		Msg:  msg,
	}
	result(200, resultData, c)
}

// Unregistered 未注册
func Unregistered(msg string, c *gin.Context) {
	resultData := ResultData{
		Code: UNREGISTERED_CODE,
		Msg:  msg,
	}
	result(200, resultData, c)
}

// Unbound 未绑定
func Unbound(msg string, c *gin.Context) {
	resultData := ResultData{
		Code: UNBOUND_CODE,
		Msg:  msg,
	}
	result(200, resultData, c)
}

// Registered 已注册
func Registered(msg string, c *gin.Context) {
	resultData := ResultData{
		Code: REGISTERED_CODE,
		Msg:  msg,
	}
	result(200, resultData, c)
}

// Bound 已绑定
func Bound(msg string, c *gin.Context) {
	resultData := ResultData{
		Code: BOUND_CODE,
		Msg:  msg,
	}
	result(200, resultData, c)
}