package com.cweb.controller;

import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import com.cweb.config.SysConst;
import com.hai.common.exception.ErrorCode;
import com.hai.common.exception.ErrorHelp;
import com.hai.common.exception.SysCode;
import com.hai.common.pay.util.XmlUtil;
import com.hai.common.pay.util.sdk.WXPayConstants;
import com.hai.common.utils.*;
import com.hai.config.*;
import com.hai.dao.HighGasOrderPushMapper;
import com.hai.entity.*;
import com.hai.model.HighMerchantModel;
import com.hai.model.HighMerchantStoreModel;
import com.hai.model.ResponseData;
import com.hai.model.ResultProfitSharing;
import com.hai.service.*;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import org.apache.commons.lang3.StringUtils;
import org.apache.http.HttpEntity;
import org.apache.http.client.methods.CloseableHttpResponse;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.conn.ssl.SSLConnectionSocketFactory;
import org.apache.http.entity.StringEntity;
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.impl.client.HttpClients;
import org.apache.http.ssl.SSLContexts;
import org.apache.http.util.EntityUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.BeanUtils;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.*;

import javax.annotation.Resource;
import javax.net.ssl.SSLContext;
import java.io.FileInputStream;
import java.math.BigDecimal;
import java.security.KeyStore;
import java.util.*;

/**
 * @Auther: 胡锐
 * @Description:
 * @Date: 2021/3/26 23:08
 */
@Controller
@RequestMapping(value = "/test")
@Api(value = "订单接口")
public class HighTestController {

    private static Logger log = LoggerFactory.getLogger(HighTestController.class);

    @Resource
    private HighMerchantService highMerchantService;

    @Resource
    private HighMerchantStoreService highMerchantStoreService;

    @Resource
    private HighGasOilPriceService highGasOilPriceService;

    @Resource
    private HighOrderService highOrderService;

    @Resource
    private HighProfitSharingRecordService highProfitSharingRecordService;

    @Resource
    private HighGasOrderPushMapper highGasOrderPushMapper;

    @RequestMapping(value = "/initTYMerchantStore", method = RequestMethod.GET)
    @ResponseBody
    @ApiOperation(value = "初始化")
    public ResponseData initTYMerchantStore(@RequestParam(name = "merchantId", required = true) Long merchantId) throws Exception {

        HighMerchantModel merchant = highMerchantService.getMerchantById(merchantId);
        if (merchant == null) {
            throw ErrorHelp.genException(SysCode.System, ErrorCode.COMMON_ERROR, "未找到商户");
        }
        JSONObject jsonObjectP = TuanYouConfig.queryGasInfoListByPage(1, 1000);
        JSONObject resultObjectP = jsonObjectP.getObject("result", JSONObject.class);

        for (int i = 1; i <= resultObjectP.getInteger("totalPageNum").intValue();i++) {
            JSONObject jsonObject = TuanYouConfig.queryGasInfoListByPage(i, 1000);
            JSONObject resultObject = jsonObject.getObject("result", JSONObject.class);
            JSONArray jsonArray = resultObject.getJSONArray("gasInfoList");
            HighMerchantStore highMerchantStore;
            HighGasOilPrice highGasOilPrice;
            for (Object gasObject : jsonArray) {
                JSONObject object = JSONObject.parseObject(JSONObject.toJSONString(gasObject));
                HighMerchantStoreModel store = highMerchantStoreService.getMerchantStoreByKey(object.getString("gasId"));
                if (store != null) {
                    store.setType(1);
                    store.setMerchantId(merchant.getId());
                    store.setCompanyId(merchant.getCompanyId());
                    store.setStoreKey(object.getString("gasId"));
                    store.setStoreName(object.getString("gasName"));
                    store.setStoreLogo(object.getString("gasLogoSmall"));
                    store.setRegionId(object.getLong("provinceCode"));
                    store.setRegionName(object.getString("provinceName"));
                    store.setAddress(object.getString("gasAddress"));
                    store.setLongitude(object.getString("gasAddressLongitude"));
                    store.setLatitude(object.getString("gasAddressLatitude"));
                    store.setStatus(object.getInteger("gasStatus"));
                    store.setOperatorId(0L);
                    store.setOperatorName("系统创建");
                    store.setUpdateTime(new Date());
                    store.setExt1(object.getString("gasSourceId"));
                    highMerchantStoreService.updateMerchantStoreDetail(store);

                    JSONArray oilPriceList = object.getJSONArray("oilPriceList");
                    for (Object oilPrice : oilPriceList) {
                        JSONObject oilPriceObject = JSONObject.parseObject(JSONObject.toJSONString(oilPrice));
                        // 查询门店油号
                        highGasOilPrice = highGasOilPriceService.getGasOilPriceByStoreAndOilNo(store.getId(), oilPriceObject.getInteger("oilNo"));
                        if (highGasOilPrice == null) {
                            highGasOilPrice = new HighGasOilPrice();
                            highGasOilPrice.setMerchantStoreId(store.getId());
                            highGasOilPrice.setOilNo(oilPriceObject.getInteger("oilNo"));
                            highGasOilPrice.setOilNoName(oilPriceObject.getString("oilNoName"));
                            highGasOilPrice.setPriceVip(oilPriceObject.getBigDecimal("priceVip"));
                            highGasOilPrice.setPriceGun(oilPriceObject.getBigDecimal("priceGun"));
                            highGasOilPrice.setPriceOfficial(oilPriceObject.getBigDecimal("priceOfficial"));
                            highGasOilPrice.setOilType(oilPriceObject.getInteger("oilType"));
                            highGasOilPrice.setOilTypeName(oilPriceObject.getString("oilTypeName"));
                        } else {
                            highGasOilPrice.setMerchantStoreId(store.getId());
                            highGasOilPrice.setOilNo(oilPriceObject.getInteger("oilNo"));
                            highGasOilPrice.setOilNoName(oilPriceObject.getString("oilNoName"));
                            highGasOilPrice.setPriceVip(oilPriceObject.getBigDecimal("priceVip"));
                            highGasOilPrice.setPriceGun(oilPriceObject.getBigDecimal("priceGun"));
                            highGasOilPrice.setPriceOfficial(oilPriceObject.getBigDecimal("priceOfficial"));
                            highGasOilPrice.setOilType(oilPriceObject.getInteger("oilType"));
                            highGasOilPrice.setOilTypeName(oilPriceObject.getString("oilTypeName"));
                        }
                        highGasOilPriceService.editGasOilPrice(highGasOilPrice);
                    }
                } else {
                    highMerchantStore = new HighMerchantStore();
                    highMerchantStore.setType(1);
                    highMerchantStore.setMerchantId(merchant.getId());
                    highMerchantStore.setCompanyId(merchant.getCompanyId());
                    highMerchantStore.setStoreKey(object.getString("gasId"));
                    highMerchantStore.setStoreName(object.getString("gasName"));
                    highMerchantStore.setStoreLogo(object.getString("gasLogoSmall"));
                    highMerchantStore.setRegionId(object.getLong("provinceCode"));
                    highMerchantStore.setRegionName(object.getString("provinceName"));
                    highMerchantStore.setAddress(object.getString("gasAddress"));
                    highMerchantStore.setLongitude(object.getString("gasAddressLongitude"));
                    highMerchantStore.setLatitude(object.getString("gasAddressLatitude"));
                    highMerchantStore.setStatus(1);
                    highMerchantStore.setOperatorId(0L);
                    highMerchantStore.setOperatorName("系统创建");
                    highMerchantStore.setCreateTime(new Date());
                    highMerchantStore.setUpdateTime(new Date());
                    highMerchantStore.setExt1(object.getString("gasSourceId"));
                    HighMerchantStoreModel merchantStoreModel = new HighMerchantStoreModel();
                    BeanUtils.copyProperties(highMerchantStore, merchantStoreModel);
                    highMerchantStoreService.insertMerchantStore(merchantStoreModel);

                    JSONArray oilPriceList = object.getJSONArray("oilPriceList");
                    for (Object oilPrice : oilPriceList) {
                        JSONObject oilPriceObject = JSONObject.parseObject(JSONObject.toJSONString(oilPrice));
                        highGasOilPrice = new HighGasOilPrice();
                        highGasOilPrice.setMerchantStoreId(merchantStoreModel.getId());
                        highGasOilPrice.setOilNo(oilPriceObject.getInteger("oilNo"));
                        highGasOilPrice.setOilNoName(oilPriceObject.getString("oilNoName"));
                        highGasOilPrice.setPriceVip(oilPriceObject.getBigDecimal("priceVip"));
                        highGasOilPrice.setPriceGun(oilPriceObject.getBigDecimal("priceGun"));
                        highGasOilPrice.setPriceOfficial(oilPriceObject.getBigDecimal("priceOfficial"));
                        highGasOilPrice.setOilType(oilPriceObject.getInteger("oilType"));
                        highGasOilPrice.setOilTypeName(oilPriceObject.getString("oilTypeName"));
                        highGasOilPriceService.editGasOilPrice(highGasOilPrice);
                    }
                }
            }
        }
        return ResponseMsgUtil.success("初始化完成");
    }

    @RequestMapping(value = "/queryCompanyAccountInfo2JD", method = RequestMethod.GET)
    @ResponseBody
    @ApiOperation(value = "查询团油账户")
    public ResponseData queryCompanyAccountInfo2JD() {
        try {
            /*HighOrder order = highOrderService.getOrderByOrderNo("HF2021091414532044405");
            for (HighChildOrder highChildOrder : order.getHighChildOrderList()) {
                HighMerchantStoreModel store = highMerchantStoreService.getMerchantStoreById(highChildOrder.getGoodsId());
                // 推送团油订单
                Map<String, Object> paramMap = new HashMap<>();
                paramMap.put("gasId", store.getStoreKey());
                paramMap.put("oilNo", highChildOrder.getGasOilNo());
                paramMap.put("gunNo", highChildOrder.getGasGunNo());
                BigDecimal priceGun = highChildOrder.getGasPriceGun();
                BigDecimal priceVip = highChildOrder.getGasPriceVip();
                paramMap.put("priceGun", priceGun);  // 枪单价
                paramMap.put("priceVip", priceVip);  // 优惠价
                paramMap.put("driverPhone", order.getMemPhone());
                paramMap.put("thirdSerialNo", order.getOrderNo());
                paramMap.put("refuelingAmount", highChildOrder.getTotalPrice());

                // 油品类型 1:汽油:2:柴油;3:天然气
                if (highChildOrder.getGasOilType() == 1) {
                    paramMap.put("accountNo", CommonSysConst.getSysConfig().getTuanYouGasolineAccount());
                } else if (highChildOrder.getGasOilType() == 2) {
                    paramMap.put("accountNo", CommonSysConst.getSysConfig().getTuanYouDieselAccount());
                }
                JSONObject orderPushObject = TuanYouConfig.refuelingOrderPush(paramMap);
                // 推送团油订单记录
                HighGasOrderPush highGasOrderPush = new HighGasOrderPush();
                highGasOrderPush.setCreateTime(new Date());
                highGasOrderPush.setCode(orderPushObject.getString("code"));
                highGasOrderPush.setRequestContent(JSONObject.toJSONString(paramMap));
                highGasOrderPush.setReturnContent(orderPushObject.toJSONString());
                highGasOrderPushMapper.insert(highGasOrderPush);

                if (orderPushObject != null && orderPushObject.getString("code").equals("200")) {
                    highChildOrder.setGasOrderNo(orderPushObject.getJSONObject("result").getString("orderNo"));
                }
            }*/
            return ResponseMsgUtil.success(TuanYouConfig.queryCompanyAccountInfo2JD());
        } catch (Exception e) {
            log.error("HighOrderController --> getOrderById() error!", e);
            return ResponseMsgUtil.exception(e);
        }
    }
    @RequestMapping(value = "/test2", method = RequestMethod.GET)
    @ResponseBody
    @ApiOperation(value = "获取汇联通Token")
    public ResponseData test2() {
        try {
            return ResponseMsgUtil.success(HuiLianTongConfig.getToken());
        } catch (Exception e) {
            log.error("HighOrderController --> getOrderById() error!", e);
            return ResponseMsgUtil.exception(e);
        }
    }

    @RequestMapping(value = "/getCorpCouTypes", method = RequestMethod.GET)
    @ResponseBody
    @ApiOperation(value = "测试")
    public ResponseData getCorpCouTypes(@RequestParam(name = "token", required = true) String token) {
        try {
            return ResponseMsgUtil.success(HuiLianTongConfig.getCorpCouTypes(token));
        } catch (Exception e) {
            log.error("HighOrderController --> getOrderById() error!", e);
            return ResponseMsgUtil.exception(e);
        }
    }

    @RequestMapping(value = "/getCouState", method = RequestMethod.GET)
    @ResponseBody
    @ApiOperation(value = "测试")
    public ResponseData getCouState(@RequestParam(name = "token", required = true) String token,
                                    @RequestParam(name = "couNo", required = true) String couNo) {
        try {
            return ResponseMsgUtil.success(HuiLianTongConfig.getCouState(token,couNo));
        } catch (Exception e) {
            log.error("HighOrderController --> getOrderById() error!", e);
            return ResponseMsgUtil.exception(e);
        }
    }

    @RequestMapping(value = "/couJointDist", method = RequestMethod.GET)
    @ResponseBody
    @ApiOperation(value = "测试")
    public ResponseData couJointDist(@RequestParam(name = "token", required = true) String token) {
        try {
            return ResponseMsgUtil.success(HuiLianTongConfig.couJointDist(token,"HF"+new Date().getTime(),"20JY000251",2,"17726395120", "oArhO6XxKSvjI9wLP3cTK-iSG8yY"));
        } catch (Exception e) {
            log.error("HighOrderController --> getOrderById() error!", e);
            return ResponseMsgUtil.exception(e);
        }
    }

    @RequestMapping(value = "/splitSccount", method = RequestMethod.GET)
    @ResponseBody
    @ApiOperation(value = "测试")
    public ResponseData splitSccount() {
        try {
            //List<HighOrder> list = highOrderService.getErrorOrder();
           /* HighOrder order = highOrderService.getOrderByOrderNo("20210827003355621063330");
            BigDecimal rake = new BigDecimal("0.01");

            // 计算微信收取的手续费     支付金额 * 0.002      注:如果与两个相邻数字的距离相等,则为上舍入的舍入模式。
            BigDecimal wxHandlingFee = order.getPayRealPrice().multiply(new BigDecimal("0.002")).setScale(2,BigDecimal.ROUND_HALF_DOWN);
            BigDecimal price = order.getPayRealPrice().subtract(wxHandlingFee);

            // 计算分账金额    手续费后的价格 * 0.01  注:如果与两个相邻数字的距离相等,则为上舍入的舍入模式。
            BigDecimal profitSharingAmount = price.multiply(rake).setScale(2,BigDecimal.ROUND_DOWN);
            this.wxProfitsharing(order.getPaySerialNo(),order.getOrderNo(),profitSharingAmount);*/

            // 获取token
            JSONObject tokenObject = HuiLianTongConfig.getToken();
            if (!tokenObject.getString("result").equals("success")) {
                throw ErrorHelp.genException(SysCode.System, ErrorCode.COMMON_ERROR, "获取token失败");
            }
            Map<String, Object> push = new HashMap<>();
            push.put("token", tokenObject.getString("data"));
            push.put("couTypeCode", "20JY000575");
            push.put("distCouCount", 1);
            push.put("userPhone", "13985049936");
            push.put("thirdUserId", "oArhO6VXHf4hUENO2Mkwm6BAiy0A");

            // 推送给高速
            JSONObject returnParam = HuiLianTongConfig.couJointDist(tokenObject.getString("data"), "HF2021092316292686806","20JY000575", 1, "13985049936", "oArhO6VXHf4hUENO2Mkwm6BAiy0A");
            return ResponseMsgUtil.success(returnParam);
        } catch (Exception e) {
            log.error("HighOrderController --> getOrderById() error!", e);
            return ResponseMsgUtil.exception(e);
        }
    }


    public void wxProfitsharing(String transaction_id,String out_order_no, BigDecimal amount) {
        try {
            Map<String,String> param = new LinkedHashMap<>();
            param.put("appid", "wx637bd6f7314daa46");
            param.put("mch_id", "1289663601");
            param.put("sub_mch_id" , "1609882817"); // 个体户黎杨珍
            param.put("transaction_id" , transaction_id);
            param.put("out_order_no" , out_order_no);
            param.put("nonce_str" , WxUtils.makeNonStr());

            // 分账金额
            BigDecimal porofitSharingAmount = amount;

            List<Map<String,Object>> receiversList = new ArrayList<>();
            Map<String,Object> receiversMap = new LinkedHashMap<>();
            receiversMap.put("type", "MERCHANT_ID");
            receiversMap.put("account", "1603942866");
            receiversMap.put("amount", porofitSharingAmount.multiply(new BigDecimal("100")).intValue());
            receiversMap.put("description", "分给商户【惠昕石化】");
            receiversList.add(receiversMap);
            param.put("receivers" , JSONObject.toJSONString(receiversList));
            String signStr = WxUtils.generateSignature(param, "Skufk5oi85wDFGl888i6wsRSTkdd5df5" , WXPayConstants.SignType.HMACSHA256);
            param.put("sign" , signStr);
            String resultXmL = this.doRefundRequest(param.get("mch_id"),null, WxUtils.mapToXml(param));

            // 请求分账返回的结果
            ResultProfitSharing resultProfitSharing = XmlUtil.getObjectFromXML(resultXmL, ResultProfitSharing.class);

            if (!resultProfitSharing.getResult_code().equals("FAIL")) {
                HighProfitSharingRecord sharingRecord = new HighProfitSharingRecord();
                sharingRecord.setOutOrderNo(resultProfitSharing.getOut_order_no());
                sharingRecord.setTransactionId(resultProfitSharing.getTransaction_id());
                sharingRecord.setOrderId(resultProfitSharing.getOrder_id());
                sharingRecord.setStatus(resultProfitSharing.getResult_code());
                sharingRecord.setPrice(amount);
                sharingRecord.setCreateTime(new Date());
                sharingRecord.setContent(resultXmL);
                highProfitSharingRecordService.insert(sharingRecord);
            }

        } catch (Exception e) {
            log.error("CmsContentController --> getCorporateAdvertising() error!", e);
        }
    }


    public CloseableHttpClient readCertificate(String mchId) throws Exception{
        /**
         * 注意PKCS12证书 是从微信商户平台-》账户设置-》 API安全 中下载的
         */
        KeyStore keyStore = KeyStore.getInstance("PKCS12");
        //P12文件目录 证书路径,这里需要你自己修改,linux下还是windows下的根路径
        FileInputStream instream = new FileInputStream("/home/project/wx_cert/1289663601_apiclient_cert.p12");
        // FileInputStream instream = new FileInputStream("G:\\hurui-project/hai-parent/hai-service/src/main/java/privatekey/1289663601_apiclient_cert.p12");
        try {
            keyStore.load(instream, "1289663601".toCharArray());//这里写密码..默认是你的MCHID
        } finally {
            instream.close();
        }
        SSLContext sslcontext = SSLContexts.custom().loadKeyMaterial(keyStore, "1289663601".toCharArray()).build();//这里也是写密码的
        SSLConnectionSocketFactory sslsf = new SSLConnectionSocketFactory(sslcontext, SSLConnectionSocketFactory.getDefaultHostnameVerifier());
        // Allow TLSv1 protocol only
        return HttpClients.custom().setSSLSocketFactory(sslsf).build();
    }

    public String doRefundRequest(String mchId, String url, String data) throws Exception {

        //小程序退款需要调用双向证书的认证
        CloseableHttpClient httpClient = readCertificate(mchId);
        try {
            HttpPost httpost = new HttpPost("https://api.mch.weixin.qq.com/secapi/pay/profitsharing"); // 设置响应头信息
            httpost.addHeader("Connection", "keep-alive");
            httpost.addHeader("Accept", "*/*");
            httpost.addHeader("Content-Type", "text/xml");
            httpost.addHeader("Host", "api.mch.weixin.qq.com");
            httpost.addHeader("X-Requested-With", "XMLHttpRequest");
            httpost.addHeader("Cache-Control", "max-age=0");
            httpost.addHeader("User-Agent", "Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.0) ");
            httpost.setEntity(new StringEntity(data, "UTF-8"));
            CloseableHttpResponse response = httpClient.execute(httpost);
            try {
                HttpEntity entity = response.getEntity();
                String jsonStr = EntityUtils.toString(response.getEntity(), "UTF-8");
                EntityUtils.consume(entity);
                return jsonStr;
            } finally {
                response.close();
            }
        } catch (Exception e){
            throw new RuntimeException(e);
        } finally {
            httpClient.close();
        }
    }

}