package wt_sdk

import (
	"gitea.weitiangame.com/sdk/wt-game/utils"
	"strings"
	"sync"
)

// OrderRefund 表示一个订单退款对象,用于生成签名参数
type OrderRefund struct {
	OutTradeNo string // 订单号
	RoleId     string // 角色ID
	Status     string // 订单状态
	RefundFee  string // 退款金额
	Timestamp  string // 时间戳
}

// RefundSDK 封装了SDK配置和工具方法
type RefundSDK struct {
	SecretKey string // 密钥
}

// 全局变量,用于保存单例实例和线程安全控制
var (
	instance2 *RefundSDK
	once2     sync.Once // 确保单例实例只初始化一次
)

// NewRefundSDK 返回一个使用密钥初始化的 RefundSDK 单例实例
func NewRefundSDK(secretKey string) *RefundSDK {
	// 使用 sync.Once 确保实例只初始化一次
	once2.Do(func() {
		instance2 = &RefundSDK{
			SecretKey: secretKey,
		}
	})
	return instance2
}

// SignParam 为指定的 OrderRefund 对象生成签名
func (sdk *RefundSDK) SignParam(order *OrderRefund) string {
	// 创建用于签名的参数字符串
	paramStr := sdk.createFormUrl(order)
	// 生成MD5签名
	md5Str := utils.Md5String(paramStr)
	// 返回大写的签名
	return strings.ToUpper(md5Str)
}

// createFormUrl 生成用于签名的参数字符串
func (sdk *RefundSDK) createFormUrl(order *OrderRefund) string {
	var builder strings.Builder
	// 按顺序拼接所有参数
	builder.WriteString(order.OutTradeNo)
	builder.WriteString(order.RoleId)
	builder.WriteString(order.Status)
	builder.WriteString(order.RefundFee)
	builder.WriteString(order.Timestamp)
	// 拼接密钥
	builder.WriteString(sdk.SecretKey)
	// 返回拼接后的字符串
	return builder.String()
}