package do

import (
	"PaymentCenter/app/constants/common"
	"PaymentCenter/app/constants/errorcode"
	"PaymentCenter/app/services"
	"xorm.io/builder"

	"PaymentCenter/app/http/entities/front"
	"PaymentCenter/app/models/merchantmodel"
	"PaymentCenter/app/models/orderrequestlogmodel"
	"PaymentCenter/app/models/ordersmodel"
	"PaymentCenter/app/models/paychannelmodel"
	"context"
)

type PayCheck struct {
	ctx        *context.Context
	WebPayReqs *front.PayReqs
	AppCheck   *services.AppCheck
	RequestLog *orderrequestlogmodel.OrderRequestLog
	Channel    *paychannelmodel.PayChannel
	Merchant   *merchantmodel.Merchant
	OldOrder   *ordersmodel.Orders
	CheckCode  int
}

func NewPayCheck(ctx *context.Context, reqs *front.PayReqs, appCheck *services.AppCheck, ip string) *PayCheck {
	if appCheck == nil {
		appCheck = services.GetAppCheck(reqs.AppId, ip)
	}
	return &PayCheck{
		ctx:        ctx,
		WebPayReqs: reqs,
		AppCheck:   appCheck,
		CheckCode:  appCheck.Code,
	}
}

func (w *PayCheck) CheckForm() {
	if _, ok := common.OrderTypeList[w.WebPayReqs.OrderType]; !ok { //判断是否是支持的支付渠道
		w.CheckCode = errorcode.PayChannelNotFound
		return
	}

}

func (w *PayCheck) CheckPayChannel() {
	conn := builder.NewCond()
	conn = conn.And(builder.Eq{"id": w.WebPayReqs.PayChannelId})
	w.Channel, w.CheckCode = services.GetAndCheckPayChannel(&paychannelmodel.PayChannel{}, conn)
}

func (w *PayCheck) CheckMerchant() {
	conn := builder.NewCond()
	conn = conn.And(builder.Eq{"id": w.AppCheck.App.MerchantId})
	w.Merchant, w.CheckCode = services.GetAndCheckMerchant(&merchantmodel.Merchant{}, conn)
}

func (w *PayCheck) CheckOrder() {
	cond := builder.NewCond()
	cond = cond.And(builder.Eq{"out_tread_no": w.WebPayReqs.OutTradeNo}, builder.Eq{"app_id": w.AppCheck.AppId}, builder.Neq{"status": common.ORDER_STATUS_CLOSE})
	order, code := services.OrderFindOne(&ordersmodel.Orders{}, cond)
	if code == errorcode.OrdersExist {
		w.OldOrder = order
		w.CheckCode = code
	}
	return
}