package shanghu

import (
	"duoduo/apis/shanghu/models"
	"duoduo/models/shanghu"
	"duoduo/tools"
	"duoduo/tools/app"
	"encoding/base64"
	"encoding/json"
	"errors"
	"github.com/gin-gonic/gin"
	"github.com/skip2/go-qrcode"
	"strconv"
	"time"
)

func DrawLog(c *gin.Context) {
	var inData models.ClientDrawLogRequest
	var sqlData shanghu.ClientActiveDrawLog
	var outData []models.ClientDrawLogReply

	err := c.ShouldBindJSON(&inData)
	if err != nil {
		app.Error(c, 400, err, err.Error())
		return
	}

	var pageSize = 10
	var pageIndex = 1

	if inData.PageSize != 0 {
		pageSize = inData.PageSize
	}
	if inData.PageIndex != 0 {
		pageIndex = inData.PageIndex
	}

	sqlData.ClientOpenID = inData.ClientOpenID
	activeDrawLogList, count, err := sqlData.GetClientActiveDrawLogListByOpenId(pageSize, pageIndex)
	if err != nil {
		app.Error(c, 500, err, err.Error())
		return
	}

	for _, v := range activeDrawLogList {
		//查询商品名称
		var drawProduct shanghu.MerchantActiveDrawProduct
		var drawLog models.ClientDrawLogReply
		drawProduct.ID = v.DrawProductID
		drawProductInfo, err := drawProduct.GetDrawProductById()
		if err != nil {
			app.Error(c, 500, err, err.Error())
			return
		}
		drawLog.DrawProductName = drawProductInfo.DrawProductName
		drawLog.IsPrize = v.IsPrize
		drawLog.Id = v.ID
		outData = append(outData, drawLog)
	}

	app.PageOK(c, outData, count, pageIndex, pageSize, app.Success)

}

func DrawLogVerificationCode(c *gin.Context) {
	var inData models.DrawLogVerificationCodeRequest
	var outData models.DrawLogVerificationCodeReply
	var sqlData shanghu.ClientActiveDrawLog

	err := c.ShouldBindJSON(&inData)
	if err != nil {
		app.Error(c, 400, err, err.Error())
		return
	}

	sqlData.ID = inData.DrawLogId
	sqlData.ClientOpenID = inData.OpenId
	drawLog, err := sqlData.GetClientActiveDrawLogListByOpenIdAndId()
	if err != nil {
		app.Error(c, 500, err, err.Error())
		return
	}

	if drawLog.IsPrize == models.NotWon {
		app.Error(c, 500, errors.New("不需要兑奖"), "不需要兑奖")
		return
	}

	outData.Key = "DRAW" + tools.MD5(strconv.FormatInt(inData.DrawLogId, 10)+"zhangkun429@")
	outData.DrawLogId = inData.DrawLogId

	str, err := json.Marshal(&outData)
	if err != nil {
		app.Error(c, 500, err, err.Error())
		return
	}
	qr, err := qrcode.Encode(string(str), qrcode.High, 200)
	if err != nil {
		app.Error(c, 500, err, err.Error())
		return
	}
	encodedData := base64.StdEncoding.EncodeToString(qr)

	app.OK(c, encodedData, app.Success)
}

func DrawCancel(c *gin.Context) {
	var inData models.DrawCancelRequest
	var sqlData shanghu.ClientActiveDrawLog

	err := c.ShouldBindJSON(&inData)
	if err != nil {
		app.Error(c, 400, err, err.Error())
		return
	}

	key := "DRAW" + tools.MD5(strconv.FormatInt(inData.DrawLogId, 10)+"zhangkun429@")
	if key != inData.Key {
		app.Error(c, 500, errors.New("数据错误"), "数据错误")
		return
	}

	sqlData.ID = inData.DrawLogId
	drawLog, err := sqlData.GetClientActiveDrawLogListById()
	if err != nil {
		app.Error(c, 500, err, err.Error())
		return
	}

	if drawLog.IsPrize != models.NotClaimed {
		app.Error(c, 500, errors.New("不允许兑奖"), "不允许兑奖")
		return
	} else {
		err = drawLog.UpdateDrawPrize()
		if err != nil {
			app.Error(c, 500, err, err.Error())
			return
		}
	}

	app.OK(c, nil, app.Success)

}

func DrawCancelInfo(c *gin.Context) {
	var inData models.DrawCancelInfoRequest
	var sqlData shanghu.ClientActiveDrawLog
	var activeConfigSql shanghu.MerchantActiveConfig
	var drawProductSql shanghu.MerchantActiveDrawProduct
	var outData models.DrawCancelInfoReply

	err := c.ShouldBindJSON(&inData)
	if err != nil {
		app.Error(c, 400, err, err.Error())
		return
	}

	key := "DRAW" + tools.MD5(strconv.FormatInt(inData.DrawLogId, 10)+"zhangkun429@")
	if key != inData.Key {
		app.Error(c, 500, errors.New("数据错误"), "数据错误")
		return
	}

	sqlData.ID = inData.DrawLogId
	drawLog, err := sqlData.GetClientActiveDrawLogListById()
	if err != nil {
		app.Error(c, 500, err, err.Error())
		return
	}
	if drawLog.IsPrize != 2 {
		app.Error(c, 500, errors.New("未中奖或已兑奖"), "未中奖或已兑奖")
		return
	}

	activeConfigSql.ID = drawLog.ActiveConfigID
	activeInfo, err := activeConfigSql.GetConfigInfoById()
	if err != nil {
		app.Error(c, 500, err, err.Error())
		return
	}
	drawProductSql.ID = drawLog.DrawProductID
	drawProduct, err := drawProductSql.GetDrawProductById()
	if err != nil {
		app.Error(c, 500, err, err.Error())
		return
	}

	outData.DrawUrl = drawProduct.DrawUrl
	outData.DrawProductName = drawProduct.DrawProductName
	outData.ActiveConfigName = activeInfo.ActiveName
	outData.DrawLogId = inData.DrawLogId
	outData.DrawTime = drawLog.CreatedAt.Format(time.DateTime)

	app.OK(c, outData, app.Success)

}