package pdd

import (
	"duoduo/conf"
	"duoduo/models/mysql"
	"duoduo/models/pdd"
	"duoduo/tools"
	"duoduo/tools/app"
	"fmt"
	"github.com/gin-gonic/gin"
	"github.com/shopspring/decimal"
	"time"
)

func PddDdkOrderListIncrementGet(c *gin.Context) {
	var inData pdd.PddDdkOrderListIncrementGetRequest
	var outData pdd.PddDdkOrderListIncrementGetResponse
	var pddErr pdd.ErrorPddResponse
	var sqlData mysql.Order
	var pag int

	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
	}
	pag = 0
	for {
		pag++
		inData.ClientId = confIni.MustValue("pdd", "client_id")
		inData.Type = "pdd.ddk.order.list.increment.get"
		inData.Timestamp = fmt.Sprintf("%d", time.Now().Unix())
		inData.DataType = "JSON"
		inData.Page = fmt.Sprintf("%d", pag)
		inData.PageSize = "50"

		startTm, _ := tools.GetTimeStamp(inData.StartUpdateTime)
		inData.StartUpdateTime = fmt.Sprintf("%d", startTm)

		endTm, _ := tools.GetTimeStamp(inData.EndUpdateTime)
		inData.EndUpdateTime = fmt.Sprintf("%d", endTm)

		inData.Sign = "sign"
		sign, err := DDKSign(inData)
		if err != nil {
			app.Error(c, 400, err, err.Error())
			return
		}
		inData.Sign = sign
		val, err := PostDDk(inData, nil)

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

		err = tools.JsonUnmarshal(val, &pddErr)
		if err != nil {
			app.Error(c, 500, err, err.Error())
			return
		}

		err = tools.JsonUnmarshal(val, &outData)
		if err != nil {
			app.Error(c, 500, nil, err.Error())
			return
		}

		if pddErr.ErrorResponse.ErrorCode != 0 {
			app.Error(c, 500, nil, pddErr.ErrorResponse.SubMsg)
			return
		}

		//同步订单信息
		for i := 0; i < len(outData.OrderListGetResponse.OrderList); i++ {
			var pid mysql.Pid
			//var order mysql.Order
			//var trans mysql.TransRecords
			var user mysql.User
			//var wallet mysql.Wallet
			sqlData.OrderID = outData.OrderListGetResponse.OrderList[i].OrderID
			sqlData.PID = outData.OrderListGetResponse.OrderList[i].PID
			sqlData.UpdateTime = tools.GetCurrntTimeStr()
			sqlData.OrderStatus = outData.OrderListGetResponse.OrderList[i].OrderStatus
			sqlData.GoodsName = outData.OrderListGetResponse.OrderList[i].GoodsName
			sqlData.GoodsThumbnailURL = outData.OrderListGetResponse.OrderList[i].GoodsThumbnailURL
			sqlData.OrderGroupSuccessTime = tools.TimeToStr(outData.OrderListGetResponse.OrderList[i].OrderGroupSuccessTime)
			sqlData.OrderStatusDesc = outData.OrderListGetResponse.OrderList[i].OrderStatusDesc
			sqlData.PromotionAmount = outData.OrderListGetResponse.OrderList[i].PromotionAmount
			sqlData.JSONData, _ = tools.JsonMarshal(&outData.OrderListGetResponse.OrderList[i])
			sqlData.OrderCreateTime = tools.TimeToStr(outData.OrderListGetResponse.OrderList[i].OrderCreateTime)
			sqlData.OrderSn = outData.OrderListGetResponse.OrderList[i].OrderSn
			sqlData.Amount = decimal.NewFromInt(outData.OrderListGetResponse.OrderList[i].PromotionAmount).Mul(decimal.NewFromFloat(0.006))
			sqlData.Amount1 = decimal.NewFromInt(outData.OrderListGetResponse.OrderList[i].PromotionAmount).Mul(decimal.NewFromFloat(0.001))
			sqlData.Amount2 = decimal.NewFromInt(outData.OrderListGetResponse.OrderList[i].PromotionAmount).Mul(decimal.NewFromFloat(0.001))
			sqlData.OrderAmount = decimal.NewFromInt(outData.OrderListGetResponse.OrderList[i].OrderAmount).Div(decimal.NewFromInt(100))

			//根据pid
			pid.Pid = outData.OrderListGetResponse.OrderList[i].PID
			pidVal, err := pid.GetOpenId()
			if err != nil {
				continue
			}
			//根据openId 获取 openId1-2
			user.OpenID = pidVal.OpenID
			userVal, err := user.Get()
			if err != nil {
				continue
			}

			sqlData.OpenId = user.OpenID
			sqlData.OpenId1 = userVal.OpenIdOne
			sqlData.OpenId2 = userVal.OpenIdTwo

			count := sqlData.GetNum()
			if count <= 0 {
				sqlData.CreateTime = tools.GetCurrntTimeStr()
				_, err = sqlData.Create()
				if err != nil {
					return
				}
			} else {
				_, err = sqlData.Update(sqlData.OrderID)
				if err != nil {
					return
				}
			}

			//统计钱包数据
			//首先获取open_id
			//本人

			err = UpdateWallet(user.OpenID)
			if err != nil {
				continue
			}

			if userVal.OpenIdOne != "" {
				err = UpdateWallet(userVal.OpenIdOne)
				if err != nil {
					continue
				}
			}

			if userVal.OpenIdTwo != "" {
				err = UpdateWallet(userVal.OpenIdTwo)
				if err != nil {
					continue
				}
			}

		}

		if outData.OrderListGetResponse.TotalCount < 50 {
			break
		}
	}

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

func UpdateWallet(openId string) error {
	var order mysql.Order
	var wallet mysql.Wallet
	var trans mysql.TransRecords
	var pid mysql.Pid

	order.OpenId = openId
	//根据订单统计钱包数据
	walletVal, err := order.GetAmountOpenId()
	if err != nil {
		return err
	}

	wallet.TotalAmount = walletVal.TotalAmount.Add(walletVal.TotalAmountOne).Add(walletVal.TotalAmountTwo)
	wallet.LatelyAmount = walletVal.LatelyAmount.Add(walletVal.LatelyAmountOne).Add(walletVal.LatelyAmountTwo)
	wallet.TodayAmount = walletVal.TodayAmount.Add(walletVal.TodayAmountOne).Add(walletVal.TodayAmountTwo)
	wallet.YesterdayAmount = walletVal.YesterdayAmount.Add(walletVal.YesterdayAmountOne).Add(walletVal.YesterdayAmountTwo)
	wallet.AvailableAmount = walletVal.AvailableAmount.Add(walletVal.AvailableAmountOne).Add(walletVal.AvailableAmountTwo)
	//本人金额计算
	//walletVal.LatelyAmount = walletVal.LatelyAmount.Div(decimal.NewFromInt(100)).Mul(decimal.NewFromFloat(0.6)).Round(2)
	//walletVal.TodayAmount = walletVal.TodayAmount.Div(decimal.NewFromInt(100)).Mul(decimal.NewFromFloat(0.6)).Round(2)
	//walletVal.TotalAmount = walletVal.TotalAmount.Div(decimal.NewFromInt(100)).Mul(decimal.NewFromFloat(0.6)).Round(2)
	//walletVal.YesterdayAmount = walletVal.YesterdayAmount.Div(decimal.NewFromInt(100)).Mul(decimal.NewFromFloat(0.6)).Round(2)
	//walletVal.AvailableAmount = walletVal.AvailableAmount.Div(decimal.NewFromInt(100)).Mul(decimal.NewFromFloat(0.6)).Round(2)

	trans.TransStatus = 3
	trans.OpenID = openId
	transVal, err := trans.GetAmount()
	if err != nil {
		return err
	}
	//已提现总金额 = 提现记录求和
	wallet.WithdrawalAmount = transVal.Amount
	//可以提现金额 = 5求和-已体现金额
	wallet.AvailableAmount = wallet.AvailableAmount.Sub(wallet.WithdrawalAmount).Round(2)
	pid.OpenID = openId
	pid.PidStatus = 1
	pidVal, err := pid.Get()
	if err != nil {
		return err
	}

	//更新钱包
	wallet.OpenID = openId
	wallet.Pid = pidVal.Pid
	wallet.UpdateTime = tools.GetCurrntTimeStr()
	_, err = wallet.UpdateAll()
	if err != nil {
		return err
	}
	return nil

}