const shareTokenDict = '0123456789abcdefghijklmnopqrstuvwxyz';

const genShareToken = function(len) {
    let token = '';
    for (let i = 0; i < len; i++) {
        token += shareTokenDict[parseInt(Math.random() * shareTokenDict.length)];
    }
    return token;
};

const calcMaxTokenLen = function(queryStr, maxLen) {
    let count = 0;
    Array.prototype.map.apply(queryStr, [(c, i) => {
        if (c === '%') {
            count++;
        }
    }]);
    return Math.floor((maxLen - queryStr.length + count) / (count + 1));
};

const calcFinalShareLinkLen = function(queryStr, tokenLen) {
    let count = 0;
    Array.prototype.map.apply(queryStr, [(c, i) => {
        if (c === '%') {
            count++;
        }
    }]);
    return queryStr.length + tokenLen + (tokenLen - 1) * count + 179 + 48;
};


// 这个方法是为了兼容IOS 546～554 版本的分享 query 两次 encode 的 bug
// 解决办法是前端在拼接分享链接之前，替换掉链接中所有的 %，这样即可避免二次 encode，然后在 launchOptions 里替换回来
export default function makeShareQuery(queryStr, isShare = true) {
    // 分享新方案，统一了
    if (queryStr) {
        queryStr = queryStr.replace(/^\?/, '');
    } else {
        queryStr = '';
    }
    const tempQuery = queryStr;
    if (queryStr) {
        queryStr = encodeURIComponent(queryStr);
        let maxTokenLen = isShare ? calcMaxTokenLen(queryStr, 1023 - 179 - 48) : 6;  // 179 是链接头和安卓qzone原生拼接的长度，48 是前端拼接的固定长度，最终为 query + token 的最大长度
        if (maxTokenLen < 2) {
            throw new Error(`share link too long (${calcFinalShareLinkLen(queryStr, 2)}), query: "${decodeURIComponent(queryStr)}"`);
        }
        let token = genShareToken(maxTokenLen);
        let limit = 0;
        while (queryStr.indexOf(token) >= 0 && limit < 100) {
            token = genShareToken(maxTokenLen);
            limit++;
        }
        if (queryStr.indexOf(token) >= 0) {
            throw new Error(`share link too long (${calcFinalShareLinkLen(queryStr, (token.length + 1))}), query: "${decodeURIComponent(queryStr)}"`);
        }

        let newStr = queryStr.replace(/%/g, (token + ''));

        // 帮安卓解决生命周期取到query的时候被转码问题，但是在navigateTo和directTo NA依然可以拿到参数，
        if (!isShare && queryStr !== '') {
            return `?blcpshare=${newStr}&bltk_new=${token}&___timestamp=${Date.now()}&__blS=false${tempQuery!==''? '&'+tempQuery: ''}`;
        }

        return `?blcpshare=${newStr}&bltk_new=${token}&___timestamp=${Date.now()}`;
    } else {
        return `?___timestamp=${Date.now()}`
    }
}
