package com.bohuikeji.frame.module.admin.utils.wx;

import com.bohuikeji.frame.module.admin.wxpay.MyConfig;
import com.bohuikeji.frame.module.admin.wxpay.WXPay;
import com.bohuikeji.frame.module.admin.wxpay.WXPayUtil;
import lombok.extern.slf4j.Slf4j;

import java.math.BigDecimal;
import java.math.RoundingMode;
import java.util.Arrays;
import java.util.HashMap;
import java.util.Map;


@Slf4j
public class wxPayUtil {
    /**
     * 付款码条码规则
     * （注：用户付款码条形码规则：18位纯数字，以10、11、12、13、14、15开头）
     */
    public static Boolean contain(String CODE){
        String[] strArr = {"10","11","12","13","14","15"};
        boolean res = Arrays.asList(strArr).contains(CODE);
        return res;
    }

    /**
     * 付款码支付
     * @param OrderNum
     * @param orderFactPrice
     * @param body
     * @param clientIp
     * @param authCode
     * @return
     */
    public Map sweepOrder(String OrderNum,String orderFactPrice,String body,String clientIp,String authCode) {
        WXPay wxpay = MyConfig.getWXPay();
        Map<String, String> data = new HashMap<String, String>();
        data.put("body", body);
        data.put("out_trade_no", OrderNum);
        data.put("fee_type", "CNY");
        data.put("total_fee", WXPayUtil.changeToFen(new BigDecimal(orderFactPrice)));
        data.put("spbill_create_ip", clientIp);
        data.put("auth_code", authCode);
        log.info("微信付款码请求参数 [{}]",data);
        try {
            Map<String, String> resp = wxpay.microPayWithPos(data);
            log.info("微信付款码接口返回："+resp);
            if ("SUCCESS".equals(resp.get("result_code"))){
                return resp;
            } else {
                log.error("下单失败："+resp);
                return resp;
            }
        } catch (Exception e) {
            e.printStackTrace();
            return null;
        }
    }


    /**
     * 作用：企业向微信用户个人付款<br>
     * 场景：企业付款为企业提供付款至用户零钱的能力，支持通过API接口付款，或通过微信支付商户平台（pay.weixin.qq.com）网页操作付款。
     * 接口文档地址：https://pay.weixin.qq.com/wiki/doc/api/tools/mch_pay.php?chapter=14_2
     *
     * @param partner_trade_no 商户订单号
     * @param openid           用户openid
     * @param amount           企业付款金额
     * @param desc             企业付款描述信息
     * @return API返回数据
     * @throws Exception e
     */
    public static Map<String, String> withdrawal(String partner_trade_no, String openid, BigDecimal amount, String desc,String type) {
        WXPay wxpay = MyConfig.getWXPay();
        log.info("提现订单号：[{}]",partner_trade_no);
        log.info("openId：[{}]",openid);
        /** 构造请求参数数据 **/
        Map<String, String> data = new HashMap<>();
        // 商户订单号partner_trade_no是10000098201411111234567890String商户订单号，需保持唯一性(只能是字母或者数字，不能包含有符号)
        data.put("partner_trade_no", partner_trade_no);
        // 用户openid	openid是oxTWIuGaIt6gTKsQRLau2M0yL16E	String	商户appid下，某用户的openid
        data.put("openid", openid);
        // 校验用户姓名选项check_name	是	FORCE_CHECK	String	NO_CHECK：不校验真实姓名,FORCE_CHECK：强校验真实姓名
        data.put("check_name", "NO_CHECK");
        // 金额	amount	是	10099	int	企业付款金额，单位为分
        data.put("amount", String.valueOf(amount.multiply(new BigDecimal(100)).setScale(2, RoundingMode.HALF_UP).intValue()));
        // 企业付款描述信息desc是理赔String企业付款操作说明信息。必填。
        data.put("desc", desc);
        // Ip地址spbill_create_ip是	192.168.0.1	String(32)	该IP同在商户平台设置的IP白名单中的IP没有关联，该IP可传用户端或者服务端的IP。
        data.put("spbill_create_ip", PayUtil.getLocalIP());
        // 微信调用接口
        Map<String, String> resultMap = wxpay.transfers(data,type);
        WXPayUtil.getLogger().info("wxPay.transfers:" + resultMap);
        return resultMap;
    }


    /**
     * 微信退款
     * @param orderNum 订单号码
     * @param refundNum 退单号码
     * @param orderFactPrice 支付总金额
     * @param refundPrice 退款金额
     * @param desc 退款说明
     * @return
     */
    public Map refund(String orderNum,String refundNum, String orderFactPrice,String refundPrice,String desc) {
        WXPay wxpay = MyConfig.getWXPay();
        Map<String, String> data = new HashMap<String, String>();
        data.put("out_trade_no",orderNum);//订单号
        data.put("out_refund_no", refundNum);//退款单号
        data.put("total_fee", WXPayUtil.changeToFen(new BigDecimal(orderFactPrice)));
        data.put("refund_fee",  WXPayUtil.changeToFen(new BigDecimal(refundPrice)));
        data.put("refund_desc", desc);
        data.put("sign_type","HMAC-SHA256");
        //data.put("notify_url", "http://zlw.frp.bhynm.net/delivery/api/wxPay/newRefund");  // 退款通知回调地址
        try {
            Map<String, String> resp = wxpay.refund(data);
            log.info("退款微信接口返回："+resp);
            if (!"SUCCESS".equals(resp.get("return_code"))){
                return resp;
            }

            if("SUCCESS".equals(resp.get("result_code"))){
                return resp;
            } else {
                log.error("退款申请失败："+resp);
                return  resp;
            }
        } catch (Exception e) {
            e.printStackTrace();
            return null;
        }
    }

    /**
     * 微信订单查询
     * @param orderNum 订单号
     * @return
     */
    public String orderQuery(String orderNum) {
        WXPay wxpay = MyConfig.getWXPay();
        Map<String, String> data = new HashMap<String, String>();
        data.put("out_trade_no", orderNum);
        try {
            Map<String, String> resp = wxpay.orderQuery(data);
            log.info("微信查询接口返回："+resp);
            if ("SUCCESS".equals(resp.get("result_code"))){
                return resp.get("trade_state_desc");
            }
            else
            {
                log.error("下单失败："+resp);
                return "下单失败："+resp.get("err_code_des");
            }

        } catch (Exception e) {
            e.printStackTrace();
            return null;
        }
    }


    /**
     * 微信查询
     * @param out_trade_no    商户订单号
     * @return
     * @throws Exception
     */
   /* public Map<String, String> wxOrderQuery(String out_trade_no) throws Exception {
        Map<String, String> mp = new HashMap<>();
        mp.put("appid", WXPayVo.getAppID());                                // 公众账号ID
        mp.put("mch_id", WXPayVo.getMchID());                               // 商户号
        // mp.put("transaction_id", transaction_id);                            // 微信订单号 (2 S 1)
        mp.put("out_trade_no", out_trade_no);                                   // 商户订单号 (2 S 1)
        mp.put("nonce_str", WXPayUtil.generateNonceStr());                      // 随机字符串
        String sign = WXPayUtil.generateSignature(mp, WXPayVo.getKey());

        StringBuilder sb = new StringBuilder();
        sb.append("<xml>");
        sb.append("<appid>" + mp.get("appid") + "</appid>");
        sb.append("<mch_id><![CDATA[" + mp.get("mch_id") + "]]></mch_id>");
        sb.append("<out_trade_no><![CDATA[" + mp.get("out_trade_no") + "]]></out_trade_no>");
        sb.append("<nonce_str>" + mp.get("nonce_str") + "</nonce_str>");
        sb.append("<sign><![CDATA[" + sign + "]]></sign>");
        sb.append("</xml>");

        String url = "https://api.mch.weixin.qq.com/pay/orderquery";
        String str = HttpUtils.post(url, sb.toString());

        Map<String, String> retmap = new HashMap<>();
        try {
            retmap = WXPayUtil.xmlToMap(str);
        } catch (Exception e) {
            e.printStackTrace();
        }
        return retmap;
    }*/

    /**
     * 关闭订单
     * @param out_trade_no       商户订单号
     * @return
     * @throws Exception
     */
   /* public Map<String, String> wxCloseOrder(String out_trade_no) throws Exception {
        Map<String, String> mp = new HashMap<>();
        mp.put("appid", WXPayVo.getAppID());                                // 公众账号ID
        mp.put("mch_id", WXPayVo.getMchID());                               // 商户号
        mp.put("out_trade_no", out_trade_no);                                   // 商户订单号 (2 S 1)
        mp.put("nonce_str", WXPayUtil.generateNonceStr());                      // 随机字符串
        String sign = WXPayUtil.generateSignature(mp, WXPayVo.getKey());

        StringBuilder sb = new StringBuilder();
        sb.append("<xml>");
        sb.append("<appid>" + mp.get("appid") + "</appid>");
        sb.append("<mch_id><![CDATA[" + mp.get("mch_id") + "]]></mch_id>");
        sb.append("<out_trade_no><![CDATA[" + mp.get("out_trade_no") + "]]></out_trade_no>");
        sb.append("<nonce_str>" + mp.get("nonce_str") + "</nonce_str>");
        sb.append("<sign><![CDATA[" + sign + "]]></sign>");
        sb.append("</xml>");

        String url = "https://api.mch.weixin.qq.com/pay/closeorder";
        String str = HttpUtils.post(url, sb.toString());

        Map<String, String> retmap = new HashMap<>();
        try {
            retmap = WXPayUtil.xmlToMap(str);
        } catch (Exception e) {
            e.printStackTrace();
        }
        return retmap;
    }*/




    /**
     * 查询退款
     * @param out_trade_no   商户订单号
     * @return
     * @throws Exception
     */
    /*public Map<String, String> wxRefundQuery(String out_trade_no) throws Exception {
        Map<String, String> mp = new HashMap<>();
        mp.put("appid", WXPayVo.getAppID());                                // 公众账号ID
        mp.put("mch_id", WXPayVo.getMchID());                               // 商户号
        mp.put("nonce_str", WXPayUtil.generateNonceStr());                  // 随机字符串
        // mp.put("transaction_id", transaction_id);                        // 微信订单号 (4 S 1)
        // mp.put("out_refund_no", out_refund_no);                          // 商户退款单号 (4 S 1)
        // mp.put("refund_id", refund_id);                                      // 微信退款单号 (4 S 1)
        mp.put("out_trade_no", out_trade_no);                                   // 商户订单号 (4 S 1)
        String sign = WXPayUtil.generateSignature(mp, WXPayVo.getKey());

        StringBuilder sb = new StringBuilder();
        sb.append("<xml>");
        sb.append("<appid>" + mp.get("appid") + "</appid>");
        sb.append("<mch_id><![CDATA[" + mp.get("mch_id") + "]]></mch_id>");
        sb.append("<nonce_str>" + mp.get("nonce_str") + "</nonce_str>");
        sb.append("<out_trade_no><![CDATA[" + mp.get("out_trade_no") + "]]></out_trade_no>");
        sb.append("<sign><![CDATA[" + sign + "]]></sign>");
        sb.append("</xml>");

        String url = "https://api.mch.weixin.qq.com/pay/refundquery";
        String str = HttpUtils.post(url, sb.toString());

        Map<String, String> retmap = new HashMap<>();
        try {
            retmap = WXPayUtil.xmlToMap(str);
        } catch (Exception e) {
            e.printStackTrace();
        }
        return retmap;
    }*/


}
