package do

import (
	"PaymentCenter/app/constants/common"
	"PaymentCenter/app/constants/errorcode"
	"PaymentCenter/app/services"

	"PaymentCenter/app/models/ordersmodel"
	"PaymentCenter/app/third/paymentService"
)

type Pay struct {
	paycheck *PayCheck
	Order    *ordersmodel.Orders
	PayCode  int
}

func NewPay(paycheck *PayCheck) *Pay {
	return &Pay{
		paycheck: paycheck,
		PayCode:  errorcode.Success,
	}
}

func (w *Pay) CreateOrder() {
	w.Order, w.PayCode = services.OrderCreate(&ordersmodel.Orders{
		MerchantId:   w.paycheck.Merchant.Id,
		PayChannelId: w.paycheck.Channel.Id,
		AppId:        w.paycheck.Channel.Id,
		OutTreadNo:   w.paycheck.WebPayReqs.OutTradeNo,
		OrderType:    w.paycheck.WebPayReqs.OrderType,
		Amount:       w.paycheck.WebPayReqs.Amount,
		ExtJson:      w.paycheck.WebPayReqs.ExtJson,
		Desc:         w.paycheck.WebPayReqs.Desc,
		Status:       common.ORDER_STATUS_WAITPAY,
	},
	)
}

func (w *Pay) Pay() {
	var (
		payFunc func(commonPayInfo *paymentService.PayOrderRequest, ExtJson string) error
		ok      bool
	)
	thirdPay := &paymentService.PayOrderRequest{
		PayChannelId:  w.paycheck.WebPayReqs.PayChannelId,
		OrderId:       w.Order.Id,
		ChannelType:   w.paycheck.Channel.ChannelType,
		Description:   w.Order.Desc,
		Amount:        w.Order.Amount,
		PayerClientIp: w.paycheck.AppCheck.Ip,
	}
	if payFunc, ok = PayWayList[w.paycheck.Channel.ChannelType]; !ok {
		w.PayCode = errorcode.PayChannelNotBuild
		return
	}
	err := payFunc(thirdPay, w.paycheck.Channel.ExtJson)
	if err != nil {
		w.PayCode = errorcode.PayChannelExtJsonError
		return
	}
	res := paymentService.PaymentService(*w.paycheck.ctx, *thirdPay)
	// payCommon.PAY_SUCCESS_CODE
	w.PayCode = res.Code
	return
}