package com.fdkankan.platform.user.factory.impl;

import com.alibaba.fastjson.JSONObject;
import com.fdkankan.common.constant.Constant;
import com.fdkankan.common.constant.ErrorCode;
import com.fdkankan.common.exception.BusinessException;
import com.fdkankan.pay.paypal.PayPalDefaultConfig;
import com.fdkankan.platform.order.entity.VirtualOrder;
import com.fdkankan.platform.order.request.RequestPlaceOrder;
import com.fdkankan.platform.order.service.IVirtualOrderService;
import com.fdkankan.platform.order.service.PayOrderService;
import com.fdkankan.platform.user.factory.Recharge;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;

import java.math.BigDecimal;

@Component
public class PaypalRecharge implements Recharge {

    @Autowired
    private PayOrderService payOrderService;
    @Autowired
    private IVirtualOrderService virtualOrderService;
    @Autowired
    private PayPalDefaultConfig payPalDefaultConfig;

    @Value("${main.url}")
    private String mainUrl;

    @Override
    public JSONObject scanPay(RequestPlaceOrder order) throws Exception {
        return getResult(order, mainUrl + payPalDefaultConfig.getPaySuccessUrl(), mainUrl + payPalDefaultConfig.getCancelUrl());
    }

    @Override
    public JSONObject h5Pay(RequestPlaceOrder order, String ip) throws Exception {
        return getResult(order, mainUrl + payPalDefaultConfig.getH5PaySuccessUrl(), mainUrl + payPalDefaultConfig.getH5CancelUrl());
    }

    private JSONObject getResult(RequestPlaceOrder order, String successUrl, String cancelUrl) throws Exception {
        VirtualOrder virtualOrderEntity = virtualOrderService.getById(order.getOrderId());
        if (virtualOrderEntity == null) {
            throw new BusinessException(ErrorCode.FAILURE_CODE_8001);
        }
        String subject = Constant.PAY_SUBJECT + "：" + virtualOrderEntity.getPoints();
        String orderSn = virtualOrderEntity.getOrderSn();
        orderSn += "_recharge";
        return payOrderService.payPalPay(orderSn, subject, subject,
                new BigDecimal(virtualOrderEntity.getPoints()), new BigDecimal(virtualOrderEntity.getPoints()),
                successUrl,
                cancelUrl);
    }

    @Override
    public String getType() {
        return "paypal_1";
    }
}
