package wechat

import (
	"context"
	"gitea.cdlsxd.cn/sdk/plugin/proto"
	"github.com/wechatpay-apiv3/wechatpay-go/core"
	"github.com/wechatpay-apiv3/wechatpay-go/core/auth"
	"github.com/wechatpay-apiv3/wechatpay-go/core/auth/verifiers"
	"sync"
)

type manager struct {
	once    sync.Once
	mutex   sync.RWMutex
	clients map[string]*core.Client
}

var instance manager

func init() {
	instance = manager{
		clients: make(map[string]*core.Client),
	}
}

func GetClient(ctx context.Context, c *Server) (*core.Client, error) {
	instance.mutex.Lock()
	defer instance.mutex.Unlock()
	if instance.clients[c.MchID] != nil {
		return instance.clients[c.MchID], nil
	}
	var err error
	instance.once.Do(func() {
		instance.clients[c.MchID], err = newClient(ctx, c)
	})
	if err != nil {
		return nil, err
	}
	return instance.clients[c.MchID], nil
}

func (s *Server) Verify(ctx context.Context, message, signature string) error {
	var verifier auth.Verifier
	verifier = verifiers.NewSHA256WithRSAVerifier(nil)
	if err := verifier.Verify(ctx, s.MchCertificateSerialNumber, message, signature); err != nil {
		return proto.ErrorSignFail(err.Error())
	}
	return nil
}