/**
 * 开放能力
 */
import { callNative, emptyFn, callNativeSync, getUid } from './util';

export default {
    /**
     * 调起用户编辑收货地址原生界面，并在编辑完成后返回用户选择的地址。
     *
     * @param {Object} options
     * @param {Function} options.success 成功回调
     * @param {Function} options.fail 失败回调
     */
    chooseAddress(options = {}) {
        callNative('chooseAddress', options);
    },
    /**
     * 获取用户授权
     *
     * @param {Object} options
     * @param {String} options.scope 授权的权限
     * @param {Function} options.success 成功回调
     * @param {Function} options.fail 失败回调
     */
    authorize(options = {}) {
        callNative('authorize', options, {scope: 'String'});
    },
    /**
     * 获取临时登录凭证（code）
     *
     * @param {Object} options
     * @param {Function} options.success 成功回调
     * @param {Function} options.fail 失败回调
     */
    login(options = {}) {
        callNative('login', options);
    },
    /**
     * 校验用户当前session_key是否有效。
     *
     * @param {Object} options
     * @param {Function} options.success 成功回调
     * @param {Function} options.fail 失败回调
     */
    checkSession(options = {}) {
        callNative('checkSession', options);
    },
    /**
     * 校验用户当前session_key是否有效
     *
     * @param {Object} options
     * @param {Boolean} options.withCredentials 是否带上登录态信息
     * @param {String} options.lang 显示用户信息的语言
     * @param {Function} options.success 成功回调
     * @param {Function} options.fail 失败回调
     */
    getUserInfo({
        withCredentials = false,
        lang = 'zh_CN',
        success = emptyFn,
        fail = emptyFn,
        complete = emptyFn
    } = {}) {
        const options = {
            withCredentials: !!withCredentials,
            lang,
            success,
            fail,
            complete
        };

        callNative('getUserInfo', options, {lang: 'String'});
    },
    /**
     * 发起支付请求
     *
     * @param {Object} options
     * @param {Function} options.success 成功回调
     * @param {Function} options.fail 失败回调
     */
    requestPayment(options = {}) {
        callNative('requestPayment', options, {}, 'requestPayment', {
            code: true
        });
    },
    /** 
     * @bldoc
     * 
     * @name getLaunchOptions2
     * @---@
     * 
     * @version 
     * 基础库 ios 1.1.1 安卓 1.1.2 开始支持
     * @---@
     * 
     * @desc 
     * 获取小程序启动时的参数。与 App.onLaunch 的回调参数一致。
     * @---@
     * 
     * @params
     * 属性 | 类型 | 默认值 | 必填 | 说明 | 版本
     * ---- | ---- | ---- | ---- | ---- | ----
     * success      | Function      |      | 否 | 收到开发者服务成功返回的回调函数 | 
     * fail         | Function      |      | 否 | 接口调用失败的回调函数 | 
     * @---@
     * 
     * @tips
     * ...
     */
    /**
     * 获取用户的当前设置。
     *
     * @param {Object} options
     * @param {Function} options.success 接口调用成功的回调函数
     * @param {Function} options.fail 接口调用失败的回调函数
     */
    getSetting(options = {}) {
        callNative('getSetting', options);
    },
    /**
     * 调起客户端小程序设置界面
     *
     * @param {Object} options
     * @param {Function} options.success 接口调用成功的回调函数
     * @param {Function} options.fail 接口调用失败的回调函数
     */
    openSetting(options = {}) {
        callNative('openSetting', options);
    },
    /**
     *  获取当前帐号信息
     *
     * @param {Object} [options={}]
     * @param {Function} options.success 接口调用成功的回调函数
     * @param {Function} options.fail 接口调用失败的回调函数
     */
    getAccountInfo(options = {}) {
        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 (!result.data.miniProgram) {
                    result.data = {
                        miniProgram: result.data
                    };
                }

                successFn(Object.assign({ errMsg: 'getAccountInfo:ok' }, result.data));
                completeFn(Object.assign({ errMsg: 'getAccountInfo:ok' }, result.data));
            } else {
                failFn({
                    errMsg: result.msg
                });
                completeFn({
                    errMsg: result.msg
                });
            }
        };

        GLOBAL_OBJECT.callbacks[callbackId] = callbackFn;
        GLOBAL_OBJECT.callNative('getAccountInfo', JSON.stringify(options), callbackId);
    },
    /**
     *  获取当前帐号信息
     */
    getAccountInfoSync() {
        let result = callNativeSync('getAccountInfoSync').data;

        if (!result.miniProgram) {
            result = {
                miniProgram: result
            };
        }

        return result;
    }
};
