package alipay

import (
	"github.com/smartwalle/alipay/v3"

	"github.com/break/junhong_cmp_fiber/internal/model"
	apperrors "github.com/break/junhong_cmp_fiber/pkg/errors"
)

// NewClientFromConfig 从 WechatConfig 构建支付宝 SDK client。
// 校验 ali_app_id、ali_private_key、ali_public_key 必须非空。
// ali_production=true 时使用生产环境，否则使用沙箱环境。
func NewClientFromConfig(cfg *model.WechatConfig) (*alipay.Client, error) {
	if cfg == nil {
		return nil, apperrors.New(apperrors.CodeNoPaymentConfig, "支付宝配置缺失：未找到启用的支付配置")
	}
	if cfg.AliAppID == "" {
		return nil, apperrors.New(apperrors.CodeNoPaymentConfig, "支付宝配置缺失：ali_app_id 不能为空")
	}
	if cfg.AliPrivateKey == "" {
		return nil, apperrors.New(apperrors.CodeNoPaymentConfig, "支付宝配置缺失：ali_private_key 不能为空")
	}
	if cfg.AliPublicKey == "" {
		return nil, apperrors.New(apperrors.CodeNoPaymentConfig, "支付宝配置缺失：ali_public_key 不能为空")
	}

	client, err := alipay.New(cfg.AliAppID, cfg.AliPrivateKey, cfg.AliProduction)
	if err != nil {
		return nil, apperrors.Wrap(apperrors.CodeNoPaymentConfig, err, "支付宝配置不可用：创建客户端失败")
	}

	// 加载支付宝公钥（公钥模式验签）
	if err := client.LoadAliPayPublicKey(cfg.AliPublicKey); err != nil {
		return nil, apperrors.Wrap(apperrors.CodeNoPaymentConfig, err, "支付宝配置不可用：加载公钥失败")
	}

	return client, nil
}
