package com.ydl.utils;

import android.text.TextUtils;

import com.ydl.ydlcommon.base.BaseApp;
import com.ydl.ydlcommon.data.PlatformDataManager;
import com.ydl.ydlcommon.data.http.EncryptUtils;
import com.ydl.ydlcommon.modular.IPlatformUserModuleService;
import com.ydl.ydlcommon.modular.ModularServiceManager;
import com.ydl.ydlcommon.router.YdlUserInfo;
import com.yidianling.common.tools.RxAppTool;

import java.util.HashMap;
import java.util.Map;
import java.util.Set;
import java.util.TreeMap;

/**
 * author : Zhangwenchao
 * e-mail : zhangwch@yidianling.com
 * time   : 2018/04/27
 *
 * 临时性的工具类,后续删除
 */

public class WebUrlParamsUtils {

    /**
     * h5添加认证url后缀
     *
     * @param url 原始url
     * @return 加签后的完整url
     */
    public static String getSuffix(String url,String appendSuffix) {

        String myUrl = url;

        //存储原url所带参数
        Map<String, String> map = getUrlParams(url);
        if(!TextUtils.isEmpty(appendSuffix)) {
            Map<String, String> appendMap = getUrlParams(appendSuffix);
            if(appendMap!=null && appendMap.size()!=0) {
                map.putAll(appendMap);
            }
        }

        String[] keys = new String[map.size()];
        String[] values = new String[map.size()];

        int i = 0;

        for (String key : map.keySet()) {
            keys[i] = key;
            values[i] = map.get(key);
            i++;
        }

        //去除原url所有参数
        if (myUrl.contains("?")) {
            myUrl = myUrl.substring(0, myUrl.indexOf("?"));
        }

        //重新组装url所有参数并加签名
        return myUrl + getSuffixNoButOther(keys, values);

    }

    /**
     * 传入完整url
     */
    public static Map<String, String> getUrlParams(String url) {
        Map<String, String> map = new HashMap<>();
        try {
            if (url != null && !url.trim().equals("")) {
                if (url.contains("?")||url.contains("&")) {
                    if (!url.endsWith("?")) {
                        //?号结尾表示没有参数
                        //有参数 取出所有参数加签
                        String urlQian = url.substring(url.lastIndexOf("?") + 1, url.length());
                        //原始键值对数组
                        String[] array = urlQian.split("&");
                        //解析后的集合
                        for (String str : array) {
                            String[] ys = str.split("=");
                            if (ys.length > 1){
                                map.put(ys[0], ys[1]);
                            }else {
                                map.put(ys[0], "");
                            }
                        }

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

    //签名里面还要加别的东西
    private static String getSuffixNoButOther(String[] keys, String[] values) {
        String time = System.currentTimeMillis() / 1000 + "";

        TreeMap<String, String> mTree = new TreeMap<>();

        if (keys != null) {
            for (int index = 0; index < keys.length; index++) {
                mTree.put(keys[index], values[index]);
            }
        }
        //移除sign参数,防止与后面拼接冲突
        mTree.remove("sign");
        mTree.remove("uid");
        mTree.remove("accessToken");
        mTree.remove("v");
        mTree.remove("isFromApp");
        mTree.remove("ffrom");
        mTree.remove("ts");
        IPlatformUserModuleService userService = ModularServiceManager.INSTANCE.getPlatformUserService();
        YdlUserInfo userInfo = null;
        if(userService!=null) {
         userInfo = ModularServiceManager.INSTANCE.getPlatformUserService().getUser();
        }
        //添加公用参数
        if (userInfo != null) {
            mTree.put("uid", userInfo.getUserId());
            mTree.put("accessToken", userInfo.getToken());
        } else {
            mTree.put("uid", "0");
        }
        mTree.put("v", RxAppTool.getAppVersionName(BaseApp.Companion.getApp()));
        mTree.put("isFromApp", "1");//1表示用户版调用接口
        mTree.put("ffrom", PlatformDataManager.INSTANCE.getRam().getChannelName());
        mTree.put("ts", time);

        Set<String> keySet = mTree.descendingKeySet();
        StringBuilder subject = new StringBuilder();
        StringBuilder toSignature = new StringBuilder();
        for (String key : keySet) {
            subject.append(key).append("=").append(mTree.get(key)).append("&");
            toSignature.append(key).append("=").append(mTree.get(key)).append("&");
        }

        toSignature.deleteCharAt(toSignature.length() - 1);

        toSignature.append("dc59cf294f37d237c1f06240568ffe21");
        subject.append("sign=").append(EncryptUtils.encryptMD5ToString(toSignature.toString()));
        return "?" + subject.toString();
    }
}