package com.hai.config;

import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import com.hai.common.pay.util.sdk.WXPayConstants;
import com.hai.common.utils.HttpsUtils;
import com.hai.common.utils.MD5Util;
import com.hai.common.utils.ResponseMsgUtil;
import com.hai.common.utils.WxUtils;
import com.hai.model.ResponseData;
import io.swagger.annotations.ApiOperation;
import org.apache.commons.collections4.MapUtils;
import org.apache.commons.lang3.StringUtils;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.ResponseBody;

import java.util.*;

/**
 * @author hurui
 * @version 1.0
 * @ClassName QianZhuConfig
 * @description: 千猪接口配置
 * @date 2021/7/5 14:18
 */
public class QianZhuConfig {

    /**
     * 获取Token
     * @param platformUniqueId  用户唯一id
     * @param nickname   昵称
     * @param mobile   电话号码
     * @return Token
     */
    public static JSONObject getToken(String platformUniqueId,String nickname,String mobile) throws Exception {
        Map<String,Object> map = new HashMap<>();
        map.put("platformId", CommonSysConst.getSysConfig().getQinzhuPlatformId());
        map.put("timestamp", new Date().getTime());
        map.put("platformUniqueId", platformUniqueId);
        map.put("nickname", nickname);
        map.put("mobile", mobile);
        map.put("sign", MD5Util.encode(generateSignature(map,CommonSysConst.getSysConfig().getQinzhuSecret()).getBytes()).toLowerCase());
        return HttpsUtils.doGet(CommonSysConst.getSysConfig().getQinzhuUrl()+"/api/v2/platform/getToken", map);
    }

    /**
     * KFC
     * 根据订单号查询订单详情
     * @param orderNo
     * @return
     * @throws Exception
     */
    public static JSONObject getKfcOrderByOrderNo(String orderNo) throws Exception {
        Map<String,Object> map = new HashMap<>();
        map.put("platformId", CommonSysConst.getSysConfig().getQinzhuPlatformId());
        map.put("timestamp", new Date().getTime());
        map.put("orderNo", orderNo);
        map.put("sign", MD5Util.encode(generateSignature(map,CommonSysConst.getSysConfig().getQinzhuSecret()).getBytes()).toLowerCase());
        return HttpsUtils.doPost(CommonSysConst.getSysConfig().getQinzhuUrl()+"/openApi/v1/kfcOrders/getByOrderNo", JSONObject.toJSONString(map));
    }

    /**
     * KFC
     * 支付订单
     * @param orderNo
     * @return
     * @throws Exception
     */
    public static JSONObject payKfcOrder(String orderNo) throws Exception {
        Map<String,Object> map = new HashMap<>();
        map.put("platformId", CommonSysConst.getSysConfig().getQinzhuPlatformId());
        map.put("timestamp", new Date().getTime());
        map.put("notifyUrl", CommonSysConst.getSysConfig().getQianzhuOrderNotify());
        map.put("orderNo", orderNo);
        map.put("sign", MD5Util.encode(generateSignature(map,CommonSysConst.getSysConfig().getQinzhuSecret()).getBytes()).toLowerCase());
        return HttpsUtils.doPost(CommonSysConst.getSysConfig().getQinzhuUrl()+"/openApi/v1/orders/payKfcOrder", JSONObject.toJSONString(map));
    }

    /**
     * 电影票
     * 根据订单号查询订单详情
     * @param orderNo
     * @return
     * @throws Exception
     */
    public static JSONObject getCinemaOrderByOrderNo(String orderNo) throws Exception {
        Map<String,Object> map = new HashMap<>();
        map.put("platformId", CommonSysConst.getSysConfig().getQinzhuPlatformId());
        map.put("timestamp", new Date().getTime());
        map.put("orderNo", orderNo);
        map.put("sign", MD5Util.encode(generateSignature(map,CommonSysConst.getSysConfig().getQinzhuSecret()).getBytes()).toLowerCase());
        return HttpsUtils.doPost(CommonSysConst.getSysConfig().getQinzhuUrl()+"/openApi/v1/orders/getByOrderNo", JSONObject.toJSONString(map));
    }

    /**
     * 电影票
     * 支付订单
     * @param orderNo
     * @return
     * @throws Exception
     */
    public static JSONObject payMovieOrder(String orderNo) throws Exception {
        Map<String,Object> map = new HashMap<>();
        map.put("platformId", CommonSysConst.getSysConfig().getQinzhuPlatformId());
        map.put("timestamp", new Date().getTime());
        map.put("orderNo", orderNo);
        map.put("sign", MD5Util.encode(generateSignature(map,CommonSysConst.getSysConfig().getQinzhuSecret()).getBytes()).toLowerCase());
        return HttpsUtils.doPost(CommonSysConst.getSysConfig().getQinzhuUrl()+"/openApi/v1/orders/payMovieOrder", JSONObject.toJSONString(map));
    }


    /**
     * 话费充值
     * 获取Token
     * @param platformUniqueId  用户唯一id
     * @param nickname   昵称
     * @param mobile   电话号码
     * @return Token
     */
    public static JSONObject getMobileToken(String platformUniqueId,String nickname,String mobile) throws Exception {
        Map<String,Object> contentMap = new LinkedHashMap<>();
        contentMap.put("platformUniqueId", platformUniqueId);
        contentMap.put("nickname", nickname);
        contentMap.put("mobile", mobile);

        Map<String,Object> map = new HashMap<>();
        map.put("platformId", "10458");
        map.put("action", "users.getTokenV2");
        map.put("version", "1.0");
        map.put("content", JSON.toJSONString(contentMap));
        map.put("traceId", WxUtils.makeNonStr());
        map.put("timestamp", new Date().getTime());
        map.put("sign", MD5Util.encode(generateSignature(map,"nnl3gg4ss0pka11t").getBytes()).toLowerCase());
        return HttpsUtils.doPost("https://live.qianzhu8.com/gateway", JSON.toJSONString(map));
    }

    /**
     * 话费订单
     * 根据订单号查询
     * @param orderNo 订单号
     * @return
     * @throws Exception
     */
    public static JSONObject getMobileOrderByOrderNo(String orderNo) throws Exception {
        Map<String,Object> contentMap = new LinkedHashMap<>();
        contentMap.put("orderNo", orderNo);
        Map<String,Object> map = new HashMap<>();
        map.put("platformId", "10458");
        map.put("action", "mobileOrders.getByOrderNo");
        map.put("version", "1.0");
        map.put("content", JSON.toJSONString(contentMap));
        map.put("traceId", WxUtils.makeNonStr());
        map.put("timestamp", new Date().getTime());
        map.put("sign", MD5Util.encode(generateSignature(map,"nnl3gg4ss0pka11t").getBytes()).toLowerCase());
        return HttpsUtils.doPost("https://nf.qianzhu8.com/gateway", JSON.toJSONString(map));
    }

    /**
     * 话费订单
     * 支付订单
     * @param orderNo
     * @return
     * @throws Exception
     */
    public static JSONObject payMobileOrder(String orderNo) throws Exception {
        Map<String,Object> contentMap = new LinkedHashMap<>();
        contentMap.put("orderNo", orderNo);
        Map<String,Object> map = new HashMap<>();
        map.put("platformId", "10458");
        map.put("action", "mobileOrders.pay");
        map.put("version", "1.0");
        map.put("content", JSON.toJSONString(contentMap));
        map.put("traceId", WxUtils.makeNonStr());
        map.put("timestamp", new Date().getTime());
        map.put("sign", MD5Util.encode(generateSignature(map,"nnl3gg4ss0pka11t").getBytes()).toLowerCase());
        return HttpsUtils.doPost("https://nf.qianzhu8.com/gateway", JSON.toJSONString(map));
    }

    /**
     * 生成签名
     * @param data  数据
     * @param key   秘钥app_secret
     * @return 加密结果
     */
    public static String generateSignature(final Map<String, Object> data, String key){
        Set<String> keySet = data.keySet();
        String[] keyArray = keySet.toArray(new String[keySet.size()]);
        Arrays.sort(keyArray);
        StringBuilder sb = new StringBuilder();
        for (String k : keyArray) {
            if (k.equals(WXPayConstants.FIELD_SIGN)) {
                continue;
            }
            if (StringUtils.isBlank(sb.toString())) {
                sb.append(k).append("=").append(data.get(k));
            } else {
                sb.append("&").append(k).append("=").append(data.get(k));
            }
        }
        sb.append(key);
        return sb.toString();
    }
}
