/**
 * 路由相关
 */
import { callNative, callNativeSync, emptyFn, isInternalSmallApp, launchOptions, getUid, appJSON } from './util';
import makeShareQuery from "../lib/makeShareQuery";

export default {
    /**
     * 保留当前页面，跳转到应用内的某个页面
     *
     * @param {object} options
     * @param {string} options.url
     */
    navigateTo(options = {}) {
        // 安卓版本下会对url转码，使用户取值不准确，故修复
        if (options.url) options.url = options.url.replace(/\?.+$/, (m) => {
            return makeShareQuery(m, false);
        });
        callNative('navigateTo', options, { url: 'String' });
    },
    /**
     * 关闭当前页面，返回上一页面或多级页面
     *
     * @param {object} options
     * @param {number} options.delta 返回的页面数，如果 delta 大于现有页面数，则返回到首页。
     */
    navigateBack({
        delta = 1,
        success = emptyFn,
        fail = emptyFn,
        complete = emptyFn
    } = {}) {
        callNative('navigateBack', { delta, success, fail, complete });
    },
    /**
     * 打开另一个小程序
     *
     * @param {object} options
     * @param {String} options.appId 要打开的小程序 appId
     * @param {String} options.path 打开的页面路径，如果为空则打开首页
     * @param {Object} options.extraData 需要传递给目标小程序的数据，目标小程序可在 App.onLaunch，App.onShow 中获取到这份数据。
     */
    navigateToMiniProgram(options = {}) {
        callNative('navigateToMiniProgram', options, { appId: 'String' });
    },
    /**
     * 关闭当前页面，跳转到应用内的某个页面
     *
     * @param {Object} options
     * @param {String} options.url
     */
    redirectTo(options = {}) {
        // 安卓版本下会对url转码，使用户取值不准确，故修复
        if (options.url) options.url = options.url.replace(/\?.+$/, (m) => {
            return makeShareQuery(m, false)
        });
        callNative('redirectTo', options, { url: 'String' });
    },
    /**
     * 跳转到 tabBar 页面，并关闭其他所有非 tabBar 页面
     *
     * @param {Object} options
     * @param {Function} options.url 需要跳转的 tabBar 页面的路径（需在 app.json 的 tabBar 字段定义的页面），路径后不能带参数。
     * @param {Function} options.success 成功回调
     * @param {Function} options.fail 失败回调
     */
    switchTab(options = {}) {
        const systemInfo = callNativeSync('getSystemInfoSync').data;

        // 安卓版本下会对url转码，使用户取值不准确，故修复
        if (options.url) options.url = options.url.replace(/\?.+$/, (m) => {
            return makeShareQuery(m, false);
        });

        if (!isInternalSmallApp || systemInfo.SDKVersion >= '3.0.1') {
            callNative('switchTab', options, { url: 'String' });
            return;
        }

        let tabBarList = appJSON.tabBar && appJSON.tabBar.list || [];
        let tabBarPages = [];

        tabBarList.forEach(tab => {
            tabBarPages.push(tab.pagePath.split('?')[0]);
        });

        const isTabPage = tabBarPages.indexOf(Service.location.href.split('?')[0]) > -1;

        const callbackId = getUid();
        const successFn = typeof options.success === 'function' ? options.success : emptyFn;
        const failFn = typeof options.fail === 'function' ? options.fail : emptyFn;
        const completeFn = typeof options.complete === 'function' ? options.complete : emptyFn;

        const callbackFn = (result) => {
            if (result.code === 0) {
                if (!isTabPage) {
                    openSchema();
                } else {
                    successFn({
                        errMsg: 'switchTab:ok'
                    });
                    completeFn({
                        errMsg: 'switchTab:ok'
                    });
                }
            } else {
                openSchema();
            }
        };

        function openSchema() {
            let schema = '';

            // if (IS_DEV) {
            //     schema = `https://miniapp.bilibili.com/applet/debug/${launchOptions.appId}${options.url}`;
            // } else {
                schema = `https://miniapp.bilibili.com/applet/${launchOptions.envVersion ? launchOptions.envVersion + '-' : ''}${launchOptions.appId}${options.url}`;
            // }

            bl.internal.openSchema({
                schema,
                success() {
                    successFn({
                        errMsg: 'switchTab:ok'
                    });
                    completeFn({
                        errMsg: 'switchTab:ok'
                    });
                },
                fail() {
                    failFn({
                        errMsg: 'switchTab:fail'
                    });
                    completeFn({
                        errMsg: 'switchTab:fail'
                    });
                }
            });
        }

        GLOBAL_OBJECT.callbacks[callbackId] = callbackFn;
        GLOBAL_OBJECT.callNative('switchTab', JSON.stringify(options), callbackId);
    }
};
