package com.hzs.third.pay.controller.notify;

import com.hzs.common.core.constant.Constants;
import com.hzs.common.core.enums.EPayChannel;
import com.hzs.common.core.utils.DateUtils;
import com.hzs.common.core.utils.StringUtils;
import com.hzs.third.pay.config.AllInPayConfig;
import com.hzs.third.pay.constants.AllInPayConstants;
import com.hzs.third.pay.service.IPayService;
import com.hzs.third.pay.util.AllInPayUtil;
import com.hzs.third.pay.util.PayUtil;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.math.BigDecimal;
import java.util.Date;
import java.util.TreeMap;

/**
 * 通联支付
 */
@Slf4j
@RestController
@RequestMapping("/allIn")
public class AllInPayNotifyController {

    @Autowired
    private AllInPayConfig allInPayConfig;
    @Autowired
    private IPayService iPayService;

    /**
     * 通联支付回调
     *
     * @param request
     */
    @PostMapping("/notify")
    public void notify(HttpServletRequest request, HttpServletResponse response) {
        try {
            // 通知传输的编码为UTF-8
            request.setCharacterEncoding(Constants.UTF8);
            // 动态遍历获取所有收到的参数,此步非常关键,因为收银宝以后可能会加字段,动态获取可以兼容
            TreeMap<String, String> params = PayUtil.getParams(request);

            log.info("通联支付回调！ body： {}", params);

            // 接受到推送通知,首先验签
            if (AllInPayUtil.validSign(params, allInPayConfig.getPublicKey(), params.get("signtype"))) {
                // 验签通过
                if (AllInPayConstants.SUCCESS_CODE.equals(params.get("trxstatus"))) {
                    // 交易成功

                    // 支付流水号
                    String payNumber = params.get("trxid");
                    // 支付时间
                    Date payTime = DateUtils.parseDateOne(params.get("paytime"), DateUtils.YAMMERERS);
                    // 支付金额
                    BigDecimal payMoney = new BigDecimal(Integer.parseInt(params.get("trxamt"))).divide(new BigDecimal("100"), 2, BigDecimal.ROUND_HALF_UP);

                    // 支付扩展类型
                    String type = params.get("trxreserved");

                    // 回调订单编号
                    String thirdOrderCode = params.get("cusorderid");
                    // 回调订单编号
                    String orderCode = thirdOrderCode;
                    // 处理订单号以及扩展类型
                    if (orderCode.indexOf("-") > 0) {
                        // 带有分隔，需要处理
                        orderCode = orderCode.split("-")[0];
                        if (StringUtils.isEmpty(type)) {
                            type = thirdOrderCode.split("-")[1].substring(0, 1);
                        }
                    }

                    // 支付后续业务处理
                    if (iPayService.notifyHandle(type, orderCode, thirdOrderCode, payNumber, payTime, payMoney, EPayChannel.ALLIN, "")) {
                        // 收到通知,返回success
                        response.setCharacterEncoding(Constants.UTF8);
                        response.getOutputStream().write("success".getBytes());
                        response.flushBuffer();
                    }
                } else {
                    log.error("通联支付回调交易失败！");
                }
            } else {
                log.error("通联支付回调验名校验失败！");
            }
        } catch (Exception e) {
            log.error("通联支付回调处理异常", e);
        }
    }

}
