package svc

import (
	"applet/app/db"
	"applet/app/db/model"
	"applet/app/e"
	"applet/app/svc"
	"applet/app/utils"
	"github.com/gin-gonic/gin"
	"strings"
	"time"
)

func StoreWithdrawFlow(c *gin.Context) {
	var req map[string]string
	if err := c.ShouldBindJSON(&req); err != nil {
		e.OutErr(c, e.ERR_INVALID_ARGS, err)
		return
	}
	user := svc.GetUser(c)
	req["agent_uid"] = utils.IntToStr(user.Info.Uid)
	withdraw, total := db.GetStoreWithdraw(svc.MasterDb(c), req)
	list := make([]map[string]string, 0)
	if withdraw != nil {
		var stateList = []string{"审核中", "审核通过", "审核通过", "审核拒绝"}
		for _, v := range *withdraw {
			name := ""
			store := db.GetStoreIdEg(svc.MasterDb(c), utils.IntToStr(v.Uid))
			if store != nil {
				name = store.Name
			}
			tmp := map[string]string{
				"id":             utils.IntToStr(v.Id),
				"name":           name,
				"amount":         v.Amount,
				"alipay_account": v.WithdrawAccount,
				"alipay_name":    v.WithdrawName,
				"state_str":      stateList[v.State],
				"state":          utils.IntToStr(v.State),
				"time":           v.CreateAt.Format("2006-01-02 15:04:05"),
				"end_time":       "",
				"memo":           v.Memo,
			}
			if v.PaymentDate != "" && v.PaymentDate != "0000-00-00 00:00:00" {
				tmp["end_time"] = v.PaymentDate
			}
			list = append(list, tmp)
		}
	}
	res := map[string]interface{}{
		"total": total,
		"list":  list,
		"state": []map[string]string{
			{"name": "审核中", "value": "0"},
			{"name": "审核通过", "value": "1"},
			{"name": "审核拒绝", "value": "3"},
		},
	}
	e.OutSuc(c, res, nil)
	return
}
func StoreWithdrawTotal(c *gin.Context) {
	var req map[string]string
	if err := c.ShouldBindJSON(&req); err != nil {
		e.OutErr(c, e.ERR_INVALID_ARGS, err)
		return
	}
	user := svc.GetUser(c)
	var allAmount float64 = 0
	var waitAmount float64 = 0
	var failAmount float64 = 0
	req["agent_uid"] = utils.IntToStr(user.Info.Uid)
	allAmount, _ = db.CommWhere(svc.MasterDb(c), req).And("state=?", 1).Sum(&model.CommunityTeamStoreWithdrawApply{}, "amount")
	waitAmount, _ = db.CommWhere(svc.MasterDb(c), req).And("state=?", 0).Sum(&model.CommunityTeamStoreWithdrawApply{}, "amount")
	failAmount, _ = db.CommWhere(svc.MasterDb(c), req).And("state=?", 3).Sum(&model.CommunityTeamStoreWithdrawApply{}, "amount")
	res := []map[string]string{
		{"name": "累计提现金额(元):" + utils.Float64ToStr(allAmount), "tip": "统计提现成功的金额"},
		{"name": "审核中金额(元):" + utils.Float64ToStr(waitAmount), "tip": "统计正在审核中的金额"},
		{"name": "审核拒绝金额(元):" + utils.Float64ToStr(failAmount), "tip": "统计审核拒绝的金额"},
	}
	e.OutSuc(c, res, nil)
	return
}
func StoreWithdrawAudit(c *gin.Context) {
	var req map[string]string
	if err := c.ShouldBindJSON(&req); err != nil {
		e.OutErr(c, e.ERR_INVALID_ARGS, err)
		return
	}
	sess := svc.MasterDb(c).NewSession()
	defer sess.Close()
	sess.Begin()
	data := db.GetStoreWithdrawById(sess, req["id"])
	if data == nil {
		sess.Rollback()
		e.OutErr(c, 400, e.NewErr(400, "记录不存在"))
		return
	}
	if data.State > 0 {
		sess.Rollback()
		e.OutErr(c, 400, e.NewErr(400, "记录已处理"))
		return
	}
	if req["state"] == "3" {
		bools := svc.MoneyCheck(c, sess, data.Uid, data.ParentUid, data.StoreType, 0, 3, utils.StrToFloat64(data.Amount), "提现审核拒绝退回", utils.StrToInt64(utils.OrderUUID(data.Uid)))
		if bools == false {
			sess.Rollback()
			e.OutErr(c, 400, e.NewErr(400, "审核失败"))
			return
		}
	}
	data.State = utils.StrToInt(req["state"])
	data.Memo = req["memo"]
	if data.State == 1 {
		data.PaymentDate = time.Now().Format("2006-01-02 15:04:05")
	}
	update, err := sess.Where("id=?", data.Id).Cols("state,payment_date,memo").Update(data)
	if update == 0 || err != nil {
		sess.Rollback()
		e.OutErr(c, 400, e.NewErr(400, "审核失败"))
		return
	}
	sess.Commit()
	e.OutSuc(c, "success", nil)
	return
}
func StoreWithdrawAuditAll(c *gin.Context) {
	var req map[string]string
	if err := c.ShouldBindJSON(&req); err != nil {
		e.OutErr(c, e.ERR_INVALID_ARGS, err)
		return
	}
	svc.MasterDb(c).In("id", strings.Split(req["ids"], ",")).And("state=0").Cols("state,payment_date").Update(&model.CommunityTeamStoreWithdrawApply{State: 1, PaymentDate: time.Now().Format("2006-01-02 15:04:05")})
	e.OutSuc(c, "success", nil)
	return
}
func StoreWithdrawOutPut(c *gin.Context) {
	var args map[string]string
	if err := c.ShouldBindJSON(&args); err != nil {
		e.OutErr(c, 200, e.ERR_INVALID_ARGS)
		return
	}
	name := "提现记录_" + args["p"]
	args["state"] = "0"
	args["size"] = "3000"
	if args["ids"] != "" {
		args["size"] = "0"
	}
	user := svc.GetUser(c)
	args["parent_uid"] = utils.IntToStr(user.Info.Uid)
	data, _ := db.GetStoreWithdraw(svc.MasterDb(c), args)
	file := utils.OutputSecond(c, name, data)
	filename := name + ".xls"
	r := map[string]string{
		"file":     file,
		"filename": filename,
	}
	e.OutSuc(c, r, nil)
	return
}