package pay

import (
	"context"
	"jnc-server/app/main/api/internal/svc"
	"jnc-server/app/main/api/internal/types"
	"jnc-server/common/xerr"
	"jnc-server/pkg/lzkit/lzUtils"
	"strings"
	"time"

	"github.com/pkg/errors"
	"github.com/zeromicro/go-zero/core/logx"
)

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

func NewPaymentCheckLogic(ctx context.Context, svcCtx *svc.ServiceContext) *PaymentCheckLogic {
	return &PaymentCheckLogic{
		Logger: logx.WithContext(ctx),
		ctx:    ctx,
		svcCtx: svcCtx,
	}
}

func (l *PaymentCheckLogic) PaymentCheck(req *types.PaymentCheckReq) (resp *types.PaymentCheckResp, err error) {
	// 根据订单号前缀判断订单类型
	if strings.HasPrefix(req.OrderNo, "U_") {
		// 升级订单
		order, err := l.svcCtx.OrderModel.FindOneByOrderNo(l.ctx, req.OrderNo)
		if err != nil {
			return nil, errors.Wrapf(xerr.NewErrCode(xerr.DB_ERROR), "查询升级订单失败: %v", err)
		}
		return &types.PaymentCheckResp{
			Type:   "agent_upgrade",
			Status: order.Status,
		}, nil
	}

	// 查询订单（包括代理订单）
	order, err := l.svcCtx.OrderModel.FindOneByOrderNo(l.ctx, req.OrderNo)
	if err != nil {
		return nil, errors.Wrapf(xerr.NewErrCode(xerr.DB_ERROR), "查询订单失败: %v", err)
	}

	// 如果订单状态是 pending 且支付平台是易支付，主动查询易支付订单状态
	if order.Status == "pending" && order.PaymentPlatform == "easypay_alipay" {
		// 检查易支付服务是否启用
		if l.svcCtx.EasyPayService != nil {
			// 主动查询易支付订单状态
			queryResp, queryErr := l.svcCtx.EasyPayService.QueryOrderStatus(l.ctx, req.OrderNo)
			if queryErr != nil {
				logx.Errorf("主动查询易支付订单状态失败，订单号: %s, 错误: %v", req.OrderNo, queryErr)
				// 查询失败不影响返回，继续返回当前订单状态
			} else {
				// 如果易支付返回订单已支付（status == 1），更新本地订单状态
				if queryResp.GetStatusInt() == 1 {
					logx.Infof("主动查询发现易支付订单已支付，订单号: %s，开始更新订单状态", req.OrderNo)

					// 重新查询订单（获取最新版本号）
					order, err = l.svcCtx.OrderModel.FindOneByOrderNo(l.ctx, req.OrderNo)
					if err != nil {
						logx.Errorf("更新订单状态前重新查询订单失败: %v", err)
					} else if order.Status == "pending" {
						// 更新订单状态
						order.Status = "paid"
						order.PayTime = lzUtils.TimeToNullTime(time.Now())
						if queryResp.TradeNo != "" {
							order.PlatformOrderId = lzUtils.StringToNullString(queryResp.TradeNo)
						}

						if updateErr := l.svcCtx.OrderModel.UpdateWithVersion(l.ctx, nil, order); updateErr != nil {
							logx.Errorf("主动查询后更新订单状态失败: %v", updateErr)
						} else {
							logx.Infof("主动查询后成功更新订单状态为已支付，订单号: %s", req.OrderNo)

							// 发送异步任务处理后续流程
							if asyncErr := l.svcCtx.AsynqService.SendQueryTask(order.Id); asyncErr != nil {
								logx.Errorf("主动查询后发送异步任务失败: %v", asyncErr)
							}

							// 返回更新后的状态
							return &types.PaymentCheckResp{
								Type:   "query",
								Status: "paid",
							}, nil
						}
					}
				}
			}
		}
	}

	return &types.PaymentCheckResp{
		Type:   "query",
		Status: order.Status,
	}, nil
}
