package controllers

import (
	"PaymentCenter/app/constants/common"
	"PaymentCenter/app/constants/errorcode"
	"PaymentCenter/app/constants/pojo"
	"PaymentCenter/app/http/entities/front"
	"PaymentCenter/app/models/orderrequestlogmodel"
	"PaymentCenter/app/services"
	"PaymentCenter/app/services/thirdpay/api"
	"PaymentCenter/app/utils"
	"PaymentCenter/config"
	"encoding/json"
	"fmt"
	"github.com/gin-gonic/gin"
	"net/http"
)

func ApiRes(c *gin.Context, data interface{}, code int, msg ...string) {
	var logId int64
	var responseData interface{}
	var message string
	var appCheckInfo *services.AppCheck
	originData := "{}"
	appInfo := GetAppCheckInfo(c)
	if appInfo != nil {
		appCheckInfo = appInfo.(*services.AppCheck)
	}
	// 空数据
	if utils.IsNil(data) {
		data = struct{}{}
	}
	// 获取错误信息
	message = errorcode.GetMsg(code, "")
	if len(msg) > 0 {
		message = fmt.Sprintf("%s:%s", message, msg[0])
	}
	// 获取日志ID
	log, exists := GetApiLogId(c)
	if exists {
		logId = log.(int64)
	}
	// 加密数据
	if code == errorcode.Success {
		if apiRsp, ok := data.(front.ApiResponse); ok && appCheckInfo.App.KeyType != pojo.NO_CRYPT {
			apiRsp.Order, code = api.EnCrypt(appCheckInfo.App, apiRsp.Order)
			if code != errorcode.Success {
				message = errorcode.GetMsg(code, "")
			}
			responseData = apiRsp
		} else {
			responseData = data
		}
	}

	if code == errorcode.Success {
		ApiSuccess(c, responseData, logId, message)
		b, _ := json.Marshal(data)
		originData = string(b)
	} else {
		ApiError(c, code, logId, message)
		originData = fmt.Sprintf("{\"code\":%d,\"message\":\"%s\"}", code, message)
	}
	// 记录日志
	if logId > 0 {
		var appId int64
		if appCheckInfo != nil {
			appId = appCheckInfo.AppId
		}
		services.RequestLogUpdate(&orderrequestlogmodel.OrderRequestLog{
			Id:               logId,
			AppId:            appId,
			OutTradeNo:       GetOutTradeNo(c),
			MerchantResponse: originData,
			Status:           common.STATUS_DISABLED,
		})
	}
}

func ApiSuccess(c *gin.Context, data interface{}, log_id int64, messageSlice ...string) {
	var message string
	if len(messageSlice) > 0 {
		message = messageSlice[0]
	}
	if message == "" {
		message = errorcode.GetMsg(errorcode.Success, c.GetHeader("local"))
	}
	if config.GetConf().Env == "production" {
		c.String(http.StatusOK, EncriptJson(gin.H{
			"code":     errorcode.Success,
			"message":  message,
			"data":     data,
			"trace_id": log_id,
		}))
	} else {
		c.JSON(http.StatusOK, gin.H{
			"code":     errorcode.Success,
			"message":  message,
			"data":     data,
			"trace_id": log_id,
		})
	}

	c.Abort()
}

/**
 * 失败时返回
 */
func ApiError(c *gin.Context, code int, log_id int64, msg ...string) {
	message := ""
	if len(msg) > 0 {
		message = msg[0]
	} else {
		message = errorcode.GetMsg(code, "")
	}
	if config.GetConf().Env == "production" {
		c.String(http.StatusOK, EncriptJson(gin.H{
			"code":     code,
			"message":  message,
			"data":     make(map[string]string),
			"trace_id": log_id,
		}))
	} else {
		c.JSON(http.StatusOK, gin.H{
			"code":     code,
			"message":  message,
			"data":     make(map[string]string),
			"trace_id": log_id,
		})
	}

	c.Abort()
}