// Code scaffolded by goctl. Safe to edit.
// goctl 1.10.1

package callback

import (
	"context"
	"encoding/json"
	"io"
	"net/http"

	"github.com/zeromicro/go-zero/core/logx"
	"sundynix-micro-go/app/plant/api/internal/svc"
)

type WechatPayCallbackLogic struct {
	logx.Logger
	ctx    context.Context
	svcCtx *svc.ServiceContext
}

// 微信支付回调
func NewWechatPayCallbackLogic(ctx context.Context, svcCtx *svc.ServiceContext) *WechatPayCallbackLogic {
	return &WechatPayCallbackLogic{
		Logger: logx.WithContext(ctx),
		ctx:    ctx,
		svcCtx: svcCtx,
	}
}

// wechatNotify 微信支付回调通知结构
type wechatNotify struct {
	Id           string `json:"id"`
	EventType    string `json:"event_type"`
	Summary      string `json:"summary"`
	ResourceType string `json:"resource_type"`
	Resource     struct {
		Algorithm      string `json:"algorithm"`
		Ciphertext     string `json:"ciphertext"`
		AssociatedData string `json:"associated_data"`
		Nonce          string `json:"nonce"`
	} `json:"resource"`
}

// WechatPayCallback 微信支付回调处理
// TODO: 接入 wechatpay-go SDK 完成验签 + 解密 + 订单状态更新
//
// 完整接入步骤：
//  1. go get github.com/wechatpay-apiv3/wechatpay-go
//  2. 在 config 中添加 WechatPay{ MchId, MchAPIv3Key, PrivateKeyPath, PublicKeyId, PublicKeyPath }
//  3. 使用 notify.NewRSANotifyHandler 验签解密
//  4. 解析 payments.Transaction 后根据 TradeState == "SUCCESS" 更新 sundynix_exchange_order 状态
func (l *WechatPayCallbackLogic) WechatPayCallback(r *http.Request) error {
	// 1. 读取请求体
	body, err := io.ReadAll(r.Body)
	if err != nil {
		l.Logger.Errorf("[微信支付回调] 读取请求体失败: %v", err)
		return err
	}
	defer r.Body.Close()

	// 2. 解析通知基本结构（不验签，记录日志）
	var notify wechatNotify
	if err = json.Unmarshal(body, &notify); err != nil {
		l.Logger.Errorf("[微信支付回调] 解析通知失败: %v, body: %s", err, string(body))
		return err
	}

	l.Logger.Infof("[微信支付回调] 收到通知 id=%s, event=%s, summary=%s",
		notify.Id, notify.EventType, notify.Summary)

	// TODO: 完成验签 + 解密 + 业务处理
	// if notify.EventType == "TRANSACTION.SUCCESS" {
	//   transaction := decrypt(notify.Resource, mchAPIv3Key)
	//   updateOrderStatus(transaction.OutTradeNo, "SUCCESS")
	// }

	return nil
}
