package pay

import (
	"github.com/stripe/stripe-go/v75"
	"github.com/stripe/stripe-go/v75/checkout/session"
	"github.com/stripe/stripe-go/v75/paymentintent"
	"github.com/stripe/stripe-go/v75/refund"
	"github.com/zeromicro/go-zero/core/logx"
)

type Stripe struct {
	Key     string `json:"key"`
	PayType string `json:"pay_type"`
}

// 生成退款
func (stripePay *Stripe) PayRefund(req *PayRefundReq) (res *PayRefundRes, err error) {
	stripe.Key = stripePay.Key
	params := &stripe.RefundParams{PaymentIntent: stripe.String(req.TradeNo)}
	_, err = refund.New(params)
	if err != nil {
		logx.Error(err)
	}
	return res, err
}

// 生成预付款
func (stripePay *Stripe) GeneratePrepayment(req *GeneratePrepaymentReq) (res *GeneratePrepaymentRes, err error) {
	var productData stripe.CheckoutSessionLineItemPriceDataProductDataParams
	// productData.Metadata = map[string]string{"order_id": "33333333333333"}

	if req.ProductName != "" {
		productData.Name = stripe.String(req.ProductName)
	}

	if req.ProductDescription != "" {
		productData.Description = stripe.String(req.ProductDescription)
	}

	if len(req.ProductImages) > 0 {
		productData.Images = req.ProductImages
	}
	// var images = make([]*string, 1)
	// var image string = "https://img2.woyaogexing.com/2023/07/25/133132a32b9f79cfad84965a4bea57e0.jpg"
	// images[0] = stripe.String(image)
	// productData.Images = images
	stripe.Key = stripePay.Key
	var resultPayment resultPayment
	switch stripePay.PayType {
	case "session":
		// session 方式
		params := &stripe.CheckoutSessionParams{
			PaymentIntentData: &stripe.CheckoutSessionPaymentIntentDataParams{Metadata: req.Metadata},
			// Params:            stripe.Params{Metadata: map[string]string{"order_id": "1111111111111"}},
			PaymentMethodTypes: stripe.StringSlice([]string{
				"card",
				// "ideal",
			}),
			LineItems: []*stripe.CheckoutSessionLineItemParams{
				{
					PriceData: &stripe.CheckoutSessionLineItemPriceDataParams{
						Currency:    stripe.String(req.Currency),
						ProductData: &productData,
						UnitAmount:  stripe.Int64(req.Amount),
					},
					Quantity: stripe.Int64(req.Quantity),
				},
			},
			Mode:       stripe.String(string(stripe.CheckoutSessionModePayment)),
			SuccessURL: stripe.String(req.SuccessURL),
			CancelURL:  stripe.String(req.CancelURL),
		}
		resCheckoutSession, err := session.New(params)
		if err != nil {
			return nil, err
		}
		resultPayment.Url = resCheckoutSession.URL
		resultPayment.SessionId = resCheckoutSession.ID
	case "intent":
		// 密钥方式
		params := &stripe.PaymentIntentParams{
			Amount:   stripe.Int64(req.Amount),
			Currency: stripe.String(string(req.Currency)),
			PaymentMethodTypes: stripe.StringSlice([]string{
				"card",
				// "ideal",
			}),
		}
		for key, item := range req.Metadata {
			params.AddMetadata(key, item)
		}
		resPaymentintent, err := paymentintent.New(params)
		if err != nil {
			return nil, err
		}
		resultPayment.TradeNo = resPaymentintent.ID
		resultPayment.ClientSecret = resPaymentintent.ClientSecret
	default:
	}

	return &GeneratePrepaymentRes{
		URL:          resultPayment.Url,
		SessionId:    resultPayment.SessionId,
		TradeNo:      resultPayment.TradeNo,
		ClientSecret: resultPayment.ClientSecret,
	}, err
}

type resultPayment struct {
	Url          string `json:"url"` // 生成预付款链接
	SessionId    string `json:"session_id"`
	TradeNo      string `json:"trade_no"`
	ClientSecret string `json:"client_secret"`
}