package com.younike.store.controller;

import com.younike.common.wxpay.service.WechatPayService;
import com.younike.service.service.ITAppUserService;
import io.swagger.annotations.Api;
import lombok.extern.log4j.Log4j2;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import javax.annotation.Resource;


@RestController()
@RequestMapping("/pay-api")
@Api(tags = "微信支付")
@Log4j2
public class WeChatController {

    @Resource
    private WechatPayService payService;

    @Value("${wechatpay.appid}")
    private String appid;

    @Value("${wechatpay.mchid}")
    private String mchid;

    @Value("${wechatpay.key}")
    private String key;

    @Value("${wechatpay.notify-url}")
    private String notifyUrl;

    @Value("${wechatpay.trade-type-jsapi}")
    private String tradeTypeApp;

    @Value("${wechatpay.body}")
    private String body;

    @Value("${wechatpay.choise}")
    private int choise;

    @Value("${wechatpay.refund-url}")
    private String refundUrl;

    @Value("${wechatpay.certpath}")
    private String certpath;

//    @Resource
//    private ITOrderService orderService;

    @Resource
    private ITAppUserService appUserService;

//    @Resource
//    private SharedSpaceTask sharedSpaceTask;

    /**
     * @Description: 普通商户模式：微信统一下单接口
     * @param: [request, response, payInfo]
     * @return: com.gd.activiti.frame.pojo.APIResult
     * @Author: maol
     * @Date: 2019/2/2 13:29
     */
//    @PostMapping("orderPayment")
//    @Transactional
//    public APIResult payment(HttpServletRequest request, HttpServletResponse response, @RequestBody SharedOrderParam param) throws Exception {
//        APIResult<Map> result = new APIResult<>();
//
//        BigDecimal payMoney = null;
//        if(0 == choise){
//            payMoney = new BigDecimal("0.01");
//        }else{
//            payMoney = param.getPayPrice();
//        }
//        // 微信订单金额(需要*100)
//        int pricenew = payMoney.multiply(new BigDecimal(100)).intValue();
//        // 查询用户信息
//        TAppUser appUser = appUserService.getById(AppContextHolder.getUserId());
//        // 生成订单号
//        boolean createFlag = false;
//        if(StringUtils.isBlank(param.getId())){
//            createFlag = true;
//            param.setId(IDGenerate.nextId());
//        }else{
//            TOrder byId = orderService.getById(param.getId());
//            if(OrderState.ALREADY_PAY.getCode().equals(byId.getOrderState())){
//                return ResultGenerator.getFailResult("订单已支付请刷新");
//            }
//            if(OrderState.CANCEL.getCode().equals(byId.getOrderState())){
//                return ResultGenerator.getFailResult("订单已取消请刷新");
//            }
//        }
//        param.setTenantUserId(AppContextHolder.getUserId());
//        //拼接统一下单地址参数
//        Map<String, String> paraMap = new HashMap<String, String>();
//        //获取请求ip地址
//        // 随机字符串
//        String nonceStr = WXPayUtil.generateNonceStr();
//        String tradeNo = param.getId(); // 支付的订单的orderId
//        String IP = request.getRemoteAddr();
//        String bodystr = "车位预定";
//        //paraMap 数组用于生成sign签名
//        paraMap.put("appid", appid); // 应用ID
//        paraMap.put("mch_id", mchid); //微信支付分配的商户号
//        paraMap.put("nonce_str", nonceStr); //不重复随机数
//        paraMap.put("body", bodystr); //订单名称
//        paraMap.put("out_trade_no", tradeNo);//订单号
//        paraMap.put("total_fee", String.valueOf(pricenew)); //付款金额 100 是1分
//        paraMap.put("spbill_create_ip", IP); //终端IP地址
//        paraMap.put("notify_url", notifyUrl);// 此路径是微信服务器调用支付结果通知路径
//        paraMap.put("trade_type",tradeTypeApp); //交易类型
//        paraMap.put("openid", param.getOpenId()); //用户openid

//        String sign = WXPayUtil.generateSignature(paraMap, key);  //商户key  sign签名
//        paraMap.put("sign", sign);

        // wechatPay对象转义为xml格式
//        WechatPay wechatPay = new WechatPay();
//        wechatPay.setAppid(appid);
//        wechatPay.setMch_id(mchid);
//        wechatPay.setNonce_str(nonceStr);
//        wechatPay.setBody(bodystr);
//        wechatPay.setOut_trade_no(tradeNo);
//        wechatPay.setTotal_fee(String.valueOf(pricenew));
//        wechatPay.setSpbill_create_ip(IP);
//        wechatPay.setNotify_url(notifyUrl);
//        wechatPay.setTrade_type(tradeTypeApp);
//        wechatPay.setSign(sign);
//        wechatPay.setOpenid(param.getOpenId());
//        System.out.println(notifyUrl);
//        XStream xstream = new XStream(new XppDriver(new XmlFriendlyNameCoder("_-", "_")));
//        xstream.alias("xml", WechatPay.class);
//        String xml = xstream.toXML(wechatPay);
//        System.out.println(xml);
//        //统一下单请求地址
//        String res = payService.unifiedorder(xml);
//        //xml转Map
//        Map<String, String> resp = WXPayUtil.xmlToMap(res);
//
//        //以下内容是返回前端页面的数据
//        String prepay_id = "";//预支付id
//        prepay_id = resp.get("prepay_id");
//        if ("SUCCESS".equals(resp.get("return_code"))) {
//            // 创建支付订单
//            if(createFlag){
//                if (orderService.createOrder(param).getCode() != 200) {
//                    throw new ApiException("创建支付订单失败");
//                }
//            }
//
//            Map<String, String> payMap = new HashMap<String, String>();
//
//            payMap.put("appId", appid);
//            payMap.put("timeStamp", WXPayUtil.getCurrentTimestamp() + "");
//            payMap.put("nonceStr", WXPayUtil.generateNonceStr());
//            payMap.put("signType", "MD5");
//            payMap.put("package", "prepay_id=" + prepay_id);
//            String paySign = WXPayUtil.generateSignature(payMap, key);
//            payMap.put("paySign", paySign);
//            payMap.put("tradeNo", tradeNo);
//            payMap.put("openId", param.getOpenId());

//            result.setResult(payMap);
//            result.setCode(ResultPacketCode.APIResultCode.Success.getCode());
//            return result;
//        }
//
//        result.setCode(ResultPacketCode.APIResultCode.Fail.getCode());
//        return result;
//    }

    /**
     * @Description: 接收微信支付成功通知、修改订单状态
     * @param: [request, response]
     * @return: void
     * @Author: maol
     * @Date: 2019/02/14 11:41
     */
//    @RequestMapping(value = "callback")
//    @RestAuth(isPublic = true)
//    @ResponseBody
//    public void callback(HttpServletRequest request, HttpServletResponse response) throws Exception {
//        String resXml = "";
//        Map<String, String> returnMap = new HashMap<>();
//        returnMap.put("return_code", "FAIL");
//        returnMap.put("return_msg", "");
//        resXml = WXPayUtil.mapToXml(returnMap);
//        response.setContentType("text/xml");
//
//        System.out.println("微信支付回调");
//        ServletInputStream inputStream = request.getInputStream();
//        String result = StreamUtils.inputStream2String(inputStream, "utf-8");
//        System.out.println("1微信支付通知结果：" + result);
//        Map<String, String> map = null;
//        try {
//            //解析微信通知返回的信息
//            map = WXPayUtil.xmlToMap(result);
//        } catch (Exception e) {
//            BufferedOutputStream out = new BufferedOutputStream(response.getOutputStream());
//            out.write(resXml.getBytes());
//            out.flush();
//            out.close();
//        }
////        判断微信支付是否成功
//        if (map.get("return_code").equals("SUCCESS") && map.get("result_code").equals("SUCCESS")) {
//            if (map.get("out_trade_no") != null && !"".equals(map.get("out_trade_no"))) {
//                System.out.println("3成功out_trade_no: " + map.get("out_trade_no"));
//                String tradeNo = map.get("out_trade_no");
//                // 查询合单信息
//                try{
//                    // 修改订单状态为已支付
//                    if(orderService.updateByOrderId(tradeNo)){
////                        sharedSpaceTask.timedInsertionTask();
//                        // TODO: 2021/8/31  正常支付成功
//                        returnMap.put("return_code", "SUCCESS");
//                        returnMap.put("return_msg", "OK");
//                        resXml = WXPayUtil.mapToXml(returnMap);
//                        response.setContentType("text/xml");
//                    }
//                }catch (Exception e){
//                    BufferedOutputStream out = new BufferedOutputStream(response.getOutputStream());
//                    out.write(resXml.getBytes());
//                    out.flush();
//                    out.close();
//                }
//
//            }
//        }
//        BufferedOutputStream out = new BufferedOutputStream(response.getOutputStream());
//        out.write(resXml.getBytes());
//        out.flush();
//        out.close();
//    }

    /**
     * @Description: 普通商户退款
     * @Param: WechatPay
     * @return: int
     * @Author: maol
     * @Date: 2019/3/6 8:44
     */
//    @PostMapping(value = "refund")
//    @RestAuth(isPublic = true)
//    @ResponseBody
//    public APIResult refund(@RequestBody SharedOrderParam param) throws Exception{
//        APIResult<Map> result = new APIResult<>();
//
//        //拼接统一查询下单地址参数
//        Map<String, String> paraMap = new HashMap<String, String>();
//        //获取请求ip地址
//        String nonceStr = WXPayUtil.generateNonceStr(); // 随机字符串
//        // 查询订单
//        String orderId = param.getId();
//        // 查询订单详情
//        ShareDto shareDto = sharedService.selectSharedOrderByOrderId(param.getId());
//        if(shareDto != null){
//            if(OrderState.NO_PAY.getCode().equals(shareDto.getOrderState())){
//                // 未支付取消
//                if(orderService.cancelOrder(orderId)){
//                    return ResultGenerator.getSuccessResult();
//                }
//                return ResultGenerator.getFailResult();
//            }
//            if(OrderState.CANCEL.getCode().equals(shareDto.getOrderState())){
//                return ResultGenerator.getFailResult("订单已取消，请刷新");
//            }
//        }
//        // 已支付判断租赁开始时间
//        // 查询系统配置可取消时间
//        List<TBaseConfig> baseConfigs = baseConfigService.list();
//        Long timeLimit = 30L;
//        if(baseConfigs != null && baseConfigs.size() > 0){
//            TBaseConfig tBaseConfig = baseConfigs.get(0);
//            // 订单开始前多少分钟可以取消
//            timeLimit = tBaseConfig.getTimeLimit();
//        }
//        // 取系统时间
//        long millis = System.currentTimeMillis();
//        // 租赁开始时间
//        long orderStartTimeMill = DateUtils.stringToDate(shareDto.getLeaseStart(), "yyyy-MM-dd HH:mm:ss").getTime();
//        // 获取订单开始前距现在分钟数
//        long l = (orderStartTimeMill - millis) / 1000 / 60;
//        if(l < timeLimit){
//            return ResultGenerator.getFailResult("订单开始前" + timeLimit + "分钟不能取消");
//        }
//        String refundId = IDGenerate.nextId();
////        // 付款金额
//        String priceFloat = "0";
////        // 需要退款的金额，去除配送费
//        String priceFloatDistribute = "0";
//        if (0 == choise) {
//            // 测试接口
//            priceFloat = "1";
//            priceFloatDistribute = "1";
//        } else {
//            priceFloat = shareDto.getPayPrice().toString();
//        }
//
//        //paraMap 数组用于生成sign签名
//        paraMap.put("appid", appid); // 微信分配的公众账号ID
//        paraMap.put("mch_id", mchid); //微信支付分配的商户号
//        paraMap.put("out_trade_no", orderId); // 商户订单号
//        paraMap.put("out_refund_no", refundId); // 商户退款单号
//        paraMap.put("total_fee", priceFloat); // 订单金额
//        paraMap.put("refund_fee", priceFloat); // 申请退款金额
//        paraMap.put("nonce_str", nonceStr); //不重复随机数
//        String sign = null;  //商户key  sign签名
//        try {
//            sign = WXPayUtil.generateSignature(paraMap, key);
//        } catch (Exception e) {
//            e.printStackTrace();
//            log.error("退款失败:"+e);
//            result.setMsg("退款失败");
//            result.setCode(ResultPacketCode.APIResultCode.Fail.getCode());
//            return result;
//        }
//        paraMap.put("sign", sign);
//
//        // wechatPay对象转义为xml格式
//        WechatPay wechatPay = new WechatPay();
//        wechatPay.setAppid(appid);
//        wechatPay.setMch_id(mchid);
//        wechatPay.setOut_trade_no(orderId);
//        wechatPay.setOut_refund_no(refundId);
//        wechatPay.setTotal_fee(priceFloat);
//        wechatPay.setRefund_fee(priceFloat);
//        wechatPay.setNonce_str(nonceStr);
//        wechatPay.setSign(sign);
//
//        XStream xstream = new XStream(new XppDriver(new XmlFriendlyNameCoder("_-", "_")));
//        xstream.alias("xml", WechatPay.class);
//        String xml = xstream.toXML(wechatPay);
//        try {
//            BasicHttpClientConnectionManager connManager;
//
//            /*----4.读取证书文件,这一段是直接从微信支付平台提供的demo中copy的，所以一般不需要修改---- */
//            // 证书
//            char[] password = mchid.toCharArray();
//            KeyStore ks = KeyStore.getInstance("PKCS12");
//            ClassPathResource cl = new ClassPathResource(certpath);
//            try {
//                ks.load(cl.getInputStream(), password);
//            } finally {
//
//            }
//
//            // 实例化密钥库 & 初始化密钥工厂
//            KeyManagerFactory kmf = KeyManagerFactory.getInstance(KeyManagerFactory.getDefaultAlgorithm());
//            kmf.init(ks, password);
//
//            // 创建 SSLContext
//            SSLContext sslContext = SSLContext.getInstance("TLS");
//            sslContext.init(kmf.getKeyManagers(), null, new SecureRandom());
//
//            SSLConnectionSocketFactory sslConnectionSocketFactory = new SSLConnectionSocketFactory(
//                    sslContext,
//                    new String[]{"TLSv1"},
//                    null,
//                    new DefaultHostnameVerifier());
//
//            connManager = new BasicHttpClientConnectionManager(
//                    RegistryBuilder.<ConnectionSocketFactory>create()
//                            .register("http", PlainConnectionSocketFactory.getSocketFactory())
//                            .register("https", sslConnectionSocketFactory)
//                            .build(),
//                    null,
//                    null,
//                    null
//            );
//            HttpClient httpClient = HttpClientBuilder.create()
//                    .setConnectionManager(connManager)
//                    .build();
//
//            /*----5.发送数据到微信的退款接口---- */
//            HttpPost httpPost = new HttpPost(refundUrl);
//            httpPost.setEntity(new StringEntity(xml, "UTF-8"));
//            HttpResponse weixinResponse = httpClient.execute(httpPost);
//            String jsonStr = EntityUtils.toString(weixinResponse.getEntity(), "UTF-8");
//
//            //xml转Map
//            Map<String, String> resp = WXPayUtil.xmlToMap(jsonStr);
//
//            //以下内容是返回前端页面的数据
//            if ("SUCCESS".equals(resp.get("result_code"))) {
//                System.out.println("SUCCESS");
//                // 更新订单状态
//                if(!orderService.cancelOrder(orderId)){
//                    return ResultGenerator.getFailResult("退款失败");
//                }
//                result.setResult(resp);
//                result.setCode(ResultPacketCode.APIResultCode.Success.getCode());
//                return result;
//            }
//            // 已取消状态
//            if("订单已全额退款".equals(resp.get("err_code_des"))){
//                if (!"003".equals(orderService.getById(orderId).getOrderState())){
//                    if(!orderService.cancelOrder(orderId)){
//                        return ResultGenerator.getFailResult("退款失败");
//                    }
//                }
//                result.setCode(ResultPacketCode.APIResultCode.Success.getCode());
//                return result;
//            }
//
//            //打印微信报错信息
//            log.error("----------wxrefund-result_code-----------" + resp.get("return_code"));
//            log.error("----------wxrefund-result--err_code---------" + resp.get("err_code"));
//            log.error("----------wxrefund-result--err_code_des---------" + resp.get("err_code_des"));
//
//
//            result.setCode(ResultPacketCode.APIResultCode.Fail.getCode());
//            return result;
//        } catch (Exception e) {
//            //打印微信报错信息
//            log.error("----------wxrefund-error-----------" + e);
//            result.setMsg("退款失败");
//            result.setCode(ResultPacketCode.APIResultCode.Fail.getCode());
//            return result;
//        }
//    }


//    @GetMapping("/queryOrder")
//    @RestAuth(isPublic = true)
//    @Transactional
//    public APIResult queryOrder(@RequestParam("orderId") String orderId) throws Exception{
//
//        Map<String, String> paraMap = new HashMap<>();
//        // 随机字符串
//        String nonceStr = WXPayUtil.generateNonceStr();
//        String bodystr = "车位预定";
//        //paraMap 数组用于生成sign签名
//        paraMap.put("appid", appid); // 应用ID
//        paraMap.put("mch_id", mchid); //微信支付分配的商户号
//        paraMap.put("nonce_str", nonceStr); //不重复随机数
//        paraMap.put("out_trade_no", orderId);//订单号
//        String sign = WXPayUtil.generateSignature(paraMap, key);  //商户key  sign签名
//
//        // wechatPay对象转义为xml格式
//        WechatPay wechatPay = new WechatPay();
//        wechatPay.setAppid(appid);
//        wechatPay.setMch_id(mchid);
//        wechatPay.setNonce_str(nonceStr);
//        wechatPay.setOut_trade_no(orderId);
//        wechatPay.setSign(sign);
//        System.out.println(notifyUrl);
//        XStream xstream = new XStream(new XppDriver(new XmlFriendlyNameCoder("_-", "_")));
//        xstream.alias("xml", WechatPay.class);
//        String xml = xstream.toXML(wechatPay);
//        System.out.println(xml);
//        //统一下单请求地址
//        String res = payService.orderQuery(xml);
//        //xml转Map
//        Map<String, String> resp = WXPayUtil.xmlToMap(res);
//        System.out.println(resp);
//        System.out.println("SUCCESS".equals(resp.get("trade_state")));
//        System.out.println("SUCCESS".equals(resp.get("result_code")));
//        System.out.println("SUCCESS".equals(resp.get("return_code")));
//        if("SUCCESS".equals(resp.get("trade_state")) && "SUCCESS".equals(resp.get("result_code")) && "SUCCESS".equals(resp.get("return_code"))){
//            log.info("更新订单支付状态");
//            if(!orderService.updateByOrderId(orderId)){
//                throw new CustomException("查询通知支付成功");
//            }
//            return ResultGenerator.getSuccessResult();
//        }
//        return ResultGenerator.getFailResult();
//    }

}
