package common

import (
	"encoding/json"
	"github.com/gin-gonic/gin"
	"runtime"
	"strconv"
	"strings"
)

type Response struct {
	ErrCode int         `json:"errcode"`
	ErrMsg  string      `json:"errmsg"`
	Data    interface{} `json:"data"`
}

type BomResponse struct {
	ErrCode int         `json:"error_code"`
	ErrMsg  string      `json:"error_msg"`
	Flag    int         `json:"flag"`
	Total   int         `json:"total"`
	Data    interface{} `json:"data"`
}

func SuccessResponse(errCode int, errMsg string, data interface{}) Response {
	return Response{
		ErrCode: errCode,
		ErrMsg:  errMsg,
		Data:    data,
	}
}

func ErrorResponse(errCode int, errMsg string) Response {
	return Response{
		ErrCode: errCode,
		ErrMsg:  errMsg,
		Data:    []string{},
	}
}

//统一输出,里面还要去处理jsonp
func Output(ctx *gin.Context,errCode int, errMsg string, data interface{}) {
	if data == nil {
		data = []string{}
	}
	response := Response{
		ErrCode: errCode,
		ErrMsg:  errMsg,
		Data:    data,
	}
	//if errCode >= 100 {
	//	//SearchApiLogger(ctx,errCode, errMsg)
	//}
	if ctx.DefaultQuery("callback", "") != "" {
		ctx.JSONP(200, response)
	} else {
		referer := ctx.Request.Referer()
		referer = strings.TrimRight(referer, "/")
		ctx.Header("Access-Control-Allow-Origin", referer)
		ctx.Header("Access-Control-Allow-Credentials", "true")
		//允许跨站访问的站点域名
		//跨域请求头设置
		ctx.JSON(200, response)
	}
}

//简单的返回数据方法
func ReturnData(ctx *gin.Context,errCode int, errMsg string, data interface{}) {
	if data == nil {
		data = []string{}
		if errCode == 0 {
			errCode = 1
		}
	}
	response := Response{
		ErrCode: errCode,
		ErrMsg:  errMsg,
		Data:    data,
	}
	ctx.JSON(200, response)
}

//错误的搜索日志记录
func SearchApiLogger(ctx *gin.Context,code int, msg string) {
	pc, file, line, _ := runtime.Caller(2)
	f := runtime.FuncForPC(pc)
	errMsg := "提示信息:" + msg + ",请求url:" + ctx.Request.URL.String()
	lineNo := strconv.Itoa(line)
	searchLog := AnalyzeSearchError(ctx,code, ctx.ClientIP(), errMsg, file, lineNo, f.Name())
	searchLogByte, _ := json.Marshal(searchLog)
	WriteSearchErrorLog(string(searchLogByte))
}