package shanghu

import (
	"context"
	"duoduo/apis/common"
	"duoduo/apis/pdd"
	"duoduo/apis/shanghu/models"
	"duoduo/conf"
	"duoduo/models/shanghu"
	"duoduo/tools"
	"duoduo/tools/app"
	"encoding/base64"
	"encoding/json"
	"errors"
	"fmt"
	"github.com/gin-gonic/gin"
	"github.com/qiniu/go-sdk/v7/auth/qbox"
	"github.com/qiniu/go-sdk/v7/storage"
	"github.com/shopspring/decimal"
	"strconv"
	"time"
)

func CreateMerchantCard(c *gin.Context) {
	var inData models.CreateMerchantCardRequest
	var sqlData shanghu.MerchantCard

	err := c.ShouldBindJSON(&inData)
	if err != nil {
		app.Error(c, 400, err, err.Error())
		return
	}
	sqlData.CreatedAt = time.Now()
	sqlData.UpdatedAt = time.Now()
	jsStr, err := json.Marshal(inData.CardProjectData)
	if err != nil {
		app.Error(c, 400, err, "包含项目不能为空")
		return
	}

	sqlData.CardProjectData = string(jsStr)
	sqlData.CardPrice = inData.CardPrice
	sqlData.CardTotalPrice = inData.CardTotalPrice
	sqlData.ActivityEndTime, err = tools.TimeToInt64(inData.ActivityEndTime, "2006-01-02")
	if err != nil {
		app.Error(c, 400, err, err.Error())
		return
	}
	sqlData.ActivityStartTime, err = tools.TimeToInt64(inData.ActivityStartTime, "2006-01-02")
	if err != nil {
		app.Error(c, 400, err, err.Error())
		return
	}
	sqlData.Inventory, err = strconv.ParseInt(inData.Inventory, 10, 64)
	if err != nil {
		app.Error(c, 400, err, err.Error())
		return
	}
	sqlData.MerchantCardTime, err = tools.TimeToInt64(inData.MerchantCardTime, "2006-01-02")
	if err != nil {
		app.Error(c, 400, err, err.Error())
		return
	}
	sqlData.MerchantOpenID = inData.MerchantOpenID
	sqlData.Picture = inData.Picture
	sqlData.QuotaNum, err = strconv.ParseInt(inData.QuotaNum, 10, 64)
	if err != nil {
		app.Error(c, 400, err, err.Error())
		return
	}
	sqlData.RebateRate, err = strconv.ParseInt(inData.RebateRate, 10, 64)
	if err != nil {
		app.Error(c, 400, err, err.Error())
		return
	}
	sqlData.UseRule = inData.UseRule
	sqlData.MerchantCardName = inData.MerchantCardName

	sqlData.CancelNumber, err = strconv.Atoi(inData.CancelNumber)
	if err != nil {
		app.Error(c, 400, err, err.Error())
		return
	}
	sqlData.BackgroundImage = inData.BackgroundImage

	_, err = sqlData.Create()
	if err != nil {
		app.Error(c, 500, err, err.Error())
		return
	}

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

}

func GetMerchantCard(c *gin.Context) {
	var inData models.GetMerchantCardRequest
	var outData models.GetMerchantCardReply
	var sqlData shanghu.MerchantCard
	var project []int64

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

	merchantCard, err := sqlData.GetMerchantCard()
	if err != nil {
		app.Error(c, 500, err, err.Error())
		return
	}
	err = json.Unmarshal([]byte(merchantCard.CardProjectData), &project)
	if err != nil {
		app.Error(c, 500, err, err.Error())
		return
	}

	merchantCard.CardProjectData = ""
	for i := 0; i < len(project); i++ {
		var cardProject shanghu.MerchantCardProject
		cardProject.ID = project[i]
		projectInfo, err := cardProject.GetMerchantCardProject()
		if err != nil {
			app.Error(c, 500, err, err.Error())
			return
		}
		merchantCard.CardProjectData = merchantCard.CardProjectData + projectInfo.ProjectName + "x1 "
	}
	outData.CardProjectData = merchantCard.CardProjectData
	outData.MerchantCardName = merchantCard.MerchantCardName
	outData.MerchantCardTime = time.Unix(merchantCard.MerchantCardTime, 0).Format("2006-01-02")
	outData.ActivityEndTime = time.Unix(merchantCard.ActivityEndTime, 0).Format("2006-01-02")
	outData.ActivityStartTime = time.Unix(merchantCard.ActivityStartTime, 0).Format("2006-01-02")
	outData.Picture = merchantCard.Picture
	outData.UseRule = merchantCard.UseRule
	outData.QuotaNum = merchantCard.QuotaNum
	outData.Inventory = merchantCard.Inventory
	outData.RebateRate = merchantCard.RebateRate
	outData.CardPrice = merchantCard.CardPrice
	outData.X = merchantCard.X
	outData.Y = merchantCard.Y
	outData.W = merchantCard.W
	outData.H = merchantCard.H
	outData.BackgroundImage = merchantCard.BackgroundImage

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

}

func GetMerchantCanvasCard(c *gin.Context) {
	var inData models.GetMerchantCardRequest
	var outData models.GetMerchantCanvasCardReply
	var sqlData shanghu.MerchantCard
	var project []int64
	var qr models.QRRequest
	var getQR models.GetQRRequest

	confIni, err := conf.ConnIni()
	if err != nil {
		app.Error(c, 400, err, err.Error())
		return
	}

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

	merchantCard, err := sqlData.GetMerchantCard()
	if err != nil {
		app.Error(c, 500, err, err.Error())
		return
	}

	outData.Static.Background = "/images/背景.jpg"
	var swiperList []models.SwiperList
	var rightButton models.RightButton
	var swiper models.SwiperList

	swiper.ID = 0
	swiper.URL = merchantCard.Picture
	swiperList = append(swiperList, swiper)
	//err = json.Unmarshal([]byte(merchantCard.Picture), &swiperList)
	//if err != nil {
	//	fmt.Println("picture")
	//	app.Error(c, 500, err, err.Error())
	//	return
	//}

	outData.Inventory = merchantCard.Inventory
	outData.SwiperList = swiperList

	rightButton.ImageURL = "/images/资源 24.png"
	outData.RightButton = append(outData.RightButton, rightButton)
	rightButton.ImageURL = "/images/资源 25.png"
	outData.RightButton = append(outData.RightButton, rightButton)
	rightButton.ImageURL = "/images/资源 26.png"
	outData.RightButton = append(outData.RightButton, rightButton)
	rightButton.ImageURL = "/images/资源 28.png"
	outData.RightButton = append(outData.RightButton, rightButton)

	var dataList models.DataList

	err = json.Unmarshal([]byte(merchantCard.CardProjectData), &project)
	if err != nil {
		fmt.Println("picture2")
		app.Error(c, 500, err, err.Error())
		return
	}

	//merchantCard.CardProjectData = ""
	for i := 0; i < len(project); i++ {
		var cardProject shanghu.MerchantCardProject
		cardProject.ID = project[i]
		projectInfo, err := cardProject.GetMerchantCardProject()
		if err != nil {
			app.Error(c, 500, err, err.Error())
			return
		}
		dataList.Name = projectInfo.ProjectName
		dataList.Count = 1
		dataList.Price = projectInfo.ProjectUnitPrice
		outData.DataList = append(outData.DataList, dataList)
	}
	var buy models.BuyKnowList

	buy.Icon = "/images/资源 46.png"
	buy.Title = "有效期"
	buy.Text = "至" + tools.TimeToStr(merchantCard.MerchantCardTime)
	outData.BuyKnowList = append(outData.BuyKnowList, buy)
	buy.Icon = "/images/资源 48.png"
	buy.Title = "限购数量"
	buy.Text = "每位用户限购1张"
	outData.BuyKnowList = append(outData.BuyKnowList, buy)
	buy.Icon = "/images/资源 49.png"
	buy.Title = "使用规则"
	buy.Text = merchantCard.UseRule
	outData.BuyKnowList = append(outData.BuyKnowList, buy)

	var shopData models.ShopData
	var merchant shanghu.Merchant
	merchant.OpenId = merchantCard.MerchantOpenID
	merchantInfo, err := merchant.GetMerchant()
	if err != nil {
		app.Error(c, 500, err, err.Error())
		return
	}

	shopData.Name = merchantInfo.MerchantName
	shopData.Address = merchantInfo.Address
	outData.ShopData = shopData

	outData.FenxiangShow = false

	outData.MerchantAmount, err = decimal.NewFromString(merchantCard.CardPrice)
	if err != nil {
		app.Error(c, 500, err, err.Error())
		return
	}

	outData.MerchantOriginalAmount, err = decimal.NewFromString(merchantCard.CardTotalPrice)
	if err != nil {
		app.Error(c, 500, err, err.Error())
		return
	}
	//outData.MerchantOriginalAmount = outData.MerchantAmount.Add(decimal.NewFromInt(50))

	var outQRData models.ClientCardQRReply

	val, err := pdd.DuoDuoGet("https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=wx25357518f710b8ce&secret=83c7dca801a6c93fbfac3c91f57a4eb2")
	if err != nil {
		app.Error(c, 500, err, err.Error())
		return
	}

	err = tools.JsonUnmarshal(val, &outQRData)
	if err != nil {
		app.Error(c, 500, err, err.Error())
		return
	}
	if outQRData.AccessToken == "" {
		app.Error(c, 500, err, "token error")
		return
	}
	url := "https://api.weixin.qq.com/wxa/getwxacodeunlimit?access_token=" + outQRData.AccessToken

	//1.原始码 不需要购买直接分享 ==原生码直接分享
	//2.code 本人openid 需要购买才能分享
	//3.空的 官方邀请码

	//返回邀请码

	if inData.Code == "yuanshima" { //可以分享   code 等于自己的与yuanshima的都给平台
		outData.IsShare = true
		outData.InvitationCode = "yuanshima"
	} else { //查询购买记录,没有购买过不让分享
		var payTrans shanghu.ClientPayTrans
		var userInfo shanghu.MerchantClientUser

		payTrans.MerchantCardID = inData.MerchantId
		payTrans.ClientOpenID = inData.Code
		payInfo, _ := payTrans.GetPayTransByOpenid()
		if payInfo.ID <= 0 {
			outData.IsShare = false
		} else {
			outData.IsShare = true
		}

		userInfo.ClientOpenID = inData.Code
		userInfoReply, _ := userInfo.GetUserInfo()

		outData.InvitationCode = userInfoReply.Code

	}

	//点击购买的时候把code给进去把 原始码购买属于平台

	qr.CheckPath = true
	qr.Page = "pages/home/home"
	qr.EnvVersion = "release"
	qr.Scene = "id-" + strconv.FormatInt(inData.MerchantId, 10) + "-c-" + outData.InvitationCode

	fmt.Println(qr.Scene)
	data, err := json.Marshal(&qr)
	if err != nil {
		app.Error(c, 500, err, err.Error())
		return
	}

	reply, err := common.Post(data, url)
	if err != nil {
		app.Error(c, 500, err, err.Error())
		return
	}

	if getQR.Errcode != 0 {
		app.Error(c, 500, err, getQR.Errmsg)
		return
	}

	encoded := base64.StdEncoding.EncodeToString(reply)

	outData.Base64Img = encoded

	//上传二维码文件
	timeUnixNano := time.Now().UnixNano() //单位纳秒
	fileName := fmt.Sprintf("%d.jpg", timeUnixNano)

	//七牛云上传图片
	bucket := "imgxx"
	key := "shanghuka/" + "erweima/" + time.Now().Format(time.DateOnly) + "/" + fileName

	putPolicy := storage.PutPolicy{
		Scope: bucket,
	}

	mac := qbox.NewMac(confIni.MustValue("ly-qn", "access_key"), confIni.MustValue("ly-qn", "secret_key"))
	upToken := putPolicy.UploadToken(mac)

	cfg := storage.Config{}
	// 空间对应的机房
	cfg.Zone = &storage.ZoneHuanan
	// 是否使用https域名
	cfg.UseHTTPS = false
	// 上传是否使用CDN上传加速
	cfg.UseCdnDomains = false

	// 构建表单上传的对象
	baseUploader := storage.NewBase64Uploader(&cfg)
	ret := storage.PutRet{}
	//data, err := base64.RawStdEncoding.DecodeString(inData.Pictures[i])
	//if err != nil {
	//	app.Error(c, 500, err, "上传图片失败")
	//	return
	//}

	err = baseUploader.Put(context.Background(), &ret, upToken, key, []byte(encoded), nil)
	if err != nil {
		app.Error(c, 500, err, "上传图片失败")
		return
	}

	outData.QRUrl = "http://lingyang.shisanmiao.com/" + key

	//err = json.Unmarshal([]byte(merchantCard.CardProjectData), &project)
	//if err != nil {
	//	app.Error(c, 500, err, err.Error())
	//	return
	//}
	//
	//merchantCard.CardProjectData = ""
	//for i := 0; i < len(project); i++ {
	//	var cardProject shanghu.MerchantCardProject
	//	cardProject.ID = project[i]
	//	projectInfo, err := cardProject.GetMerchantCardProject()
	//	if err != nil {
	//		app.Error(c, 500, err, err.Error())
	//		return
	//	}
	//	merchantCard.CardProjectData = merchantCard.CardProjectData + projectInfo.ProjectName + "x1 "
	//}

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

}

func MerchantCardList(c *gin.Context) {
	var inData models.MerchantCardListRequest
	var sqlData shanghu.MerchantCard

	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
	}
	fmt.Println(inData.OpenId)
	sqlData.MerchantOpenID = inData.OpenId

	merchantCard, count, err := sqlData.GetOpenIdList(pageSize, pageIndex, inData.TypeList)
	if err != nil {
		app.Error(c, 500, err, err.Error())
		return
	}
	app.PageOK(c, merchantCard, count, pageIndex, pageSize, app.Success)

}

// c端获取卡信息
func MerchantClientCardList(c *gin.Context) {
	var inData models.MerchantCardListRequest
	var sqlData shanghu.MerchantCard
	var outData []models.MerchantCardListReply

	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
	}

	merchantCard, count, err := sqlData.ClientGetOpenIdList(pageSize, pageIndex, inData.TypeList)
	if err != nil {
		app.Error(c, 500, err, err.Error())
		return
	}

	for i := 0; i < len(merchantCard); i++ {
		var reply models.MerchantCardListReply
		reply.RebateRate = merchantCard[i].RebateRate
		reply.ID = merchantCard[i].ID
		reply.QuotaNum = merchantCard[i].QuotaNum
		reply.MerchantCardName = merchantCard[i].MerchantCardName
		reply.CardPrice = merchantCard[i].CardPrice
		priceDec, err := decimal.NewFromString(merchantCard[i].CardPrice)
		if err != nil {
			app.Error(c, 500, err, err.Error())
			return
		}
		reply.RebateAmount = priceDec.Mul(decimal.NewFromInt(merchantCard[i].RebateRate).Div(decimal.NewFromInt(100))).String()
		outData = append(outData, reply)
	}
	app.PageOK(c, outData, count, pageIndex, pageSize, app.Success)

}

func UpdateMerchantCard(c *gin.Context) {
	var inData models.UpdateMerchantCardRequest
	var sqlData shanghu.MerchantCard

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

	sqlData.ID = inData.ID
	sqlData.QuotaNum = inData.QuotaNum
	sqlData.UseRule = inData.UseRule
	sqlData.Picture = inData.Picture
	sqlData.Inventory = inData.Inventory
	sqlData.ActivityStartTime = inData.ActivityStartTime
	sqlData.ActivityEndTime = inData.ActivityEndTime
	err = sqlData.UpdateMerchantCard()
	if err != nil {
		app.Error(c, 400, err, err.Error())
		return
	}

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

func UpdateMerchantCardWXYZ(c *gin.Context) {
	var inData models.UpdateMerchantCardWHXYRequest
	var sqlData shanghu.MerchantCard
	var whxy []models.WHXYStr

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

	//"json: cannot unmarshal number -0.33279827286174424 into Go struct field WHXYStr.rotate of type int"
	err = json.Unmarshal([]byte(inData.Whxy), &whxy)
	if err != nil {
		app.Error(c, 400, err, err.Error())
		return
	}
	for i := 0; i < len(whxy); i++ {
		if !whxy[i].Y.IsZero() {
			sqlData.W = whxy[i].W.String()
			sqlData.X = whxy[i].X.String()
			sqlData.Y = whxy[i].Y.String()
			sqlData.H = whxy[i].H.String()
		}
	}
	sqlData.ID = inData.MerchantCardId

	err = sqlData.UpdateMerchantWHXY()
	if err != nil {
		app.Error(c, 400, err, err.Error())
		return
	}

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

// 核销次数
func CancelNumber(c *gin.Context) {
	var inData models.CancelCardRequest
	var sqlData shanghu.MerchantCard
	var log shanghu.CancelLog
	var qrMessage models.QRData
	var clientPay shanghu.ClientPayTrans

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

	err = json.Unmarshal([]byte(inData.QRMessage), &qrMessage)
	if err != nil {
		app.Error(c, 400, err, err.Error())
		return
	}

	clientPay.MerchantCardID = qrMessage.MerchantId
	clientPay.ClientOpenID = qrMessage.ClientOpenId
	clientInfo, err := clientPay.GetPayTransByOpenid()
	if err != nil {
		app.Error(c, 400, err, err.Error())
		return
	}

	if clientInfo.ID == 0 {
		app.Error(c, 200, errors.New("用户未购买此卡"), "用户未购买此卡")
		return
	}

	sqlData.ID = qrMessage.MerchantId
	merchantInfo, err := sqlData.GetMerchantCard()
	if err != nil {
		app.Error(c, 500, err, err.Error())
		return
	}

	log.MerchantID = qrMessage.MerchantId
	log.ClientOpenID = qrMessage.ClientOpenId
	if log.GetNumber() >= merchantInfo.CancelNumber {
		app.Error(c, 200, errors.New("卡已使用完,请重新购买"), "卡已使用完,请重新购买")
		return
	}

	if merchantInfo.MerchantOpenID != inData.MerchantOpenId {
		app.Error(c, 200, errors.New("核销商家与发卡商家不一致"), "核销商家与发卡商家不一致")
		return
	}

	log.MerchantID = qrMessage.MerchantId
	log.ClientOpenID = qrMessage.ClientOpenId
	log.MerchantOpenID = inData.MerchantOpenId
	log.CreatedAt = time.Now()
	log.UpdatedAt = time.Now()

	_, err = log.Create()
	if err != nil {
		app.Error(c, 500, err, err.Error())
		return
	}

	app.OK(c, nil, "核销成功")

}