var _events = {};
var apis = require('./apis');
var core = require('./core');

// get user agent data
var getUA = (function() {
    var uastr = navigator.userAgent;
    var appVersionMatch = uastr.match(/apollo\/[\w\.\d]+\/([\d\.]+)/);
    var appVersion = appVersionMatch && appVersionMatch[1];
    return function(opt) {
        var result = {};
        var success = opt && opt.success;
        var ua = {
            platform: 'dpapp',
            appName: 'apollo',
            packageId: 'apollo',
            appVersion: appVersion,
            osName: core._osUA.name,
            osVersion: core._osUA.version
        };
        success && success(ua);
        return ua;
    };
})();
/**
 * <b>阿波罗手机端jsbridge</b><br/>
 * 继承自dpapp-core,[dpapp-core](http://efte.github.io/dpapp/#概述)部分可参考http://efte.github.io/dpapp/#概述
 * @module dpapp-apollo
 * @class PatchApp
 * @extends dpapp-core
 * */
var Patch = module.exports = {
    // get user agent
    /**
     * 获取用户所使用的浏览器的代理信息
     * @method getUA
     * @param opt {Object} 参数传递
     * @param opt.success {Function} 获取成功后执行的回调函数
     * @return {Object}
     * @example
     *      import dpappApollo from 'dpapp-apollo';
     *      let ua = dpappApollo.getUA();
     *
     *      console.dir(ua.platform); //平台信息
     *      console.dir(ua.appName);  //app名字
     *      console.dir(ua.packageId);
     *      console.dir(ua.appVersion);//版本考
     *      console.dir(ua.osName);
     *      console.dir(ua.osVersion);
     * */
    getUA: getUA,

    // page ready
    /**
     * 等待整个native就绪后执行回调里的逻辑
     * @method ready
     * @param callback {Function} 需要执行的回调方法
     * @return {Null}
     * @example
     *      import dpappApollo from 'dpapp-apollo';
     *      dpappApollo.ready(()=>{
     *          //页面主逻辑
     *          console.dir('页面主逻辑');
     *      });
     * */
    ready: function(callback) {
        var self = this;
        this._send('ready', {
            success: function() {
                self._isReady = true;
                callback();
            }
        });
    },

    /**
     * 发送一个请求,获取服务器端的数据<br/>
     * @method ajax
     * @param opts {Object}
     * @param opts.success {Function} 成功后的回调方法
     * @param opts.fail {Function} 失败后的回调方法
     * @param opts.data {Object} 传递给服务端的参数
     * @param opts.method {String} 请求方式 get|post
     * @example
     *      import dpappApollo from 'dpapp-apollo';
     *      dpappApollo.ajax({
     *          method:'post',
     *          url:'https://a.dper.com/demo/demo',
     *          data:{
     *              name:'app'
     *          },
     *          success:function(data){
     *              console.dir('成功');
     *          },
     *          fail:function(){
     *              console.dir('失败');
     *          }
     *      });
     * */
    ajax: function(opts) {
        // process ajax config
        opts = this._sanitizeAjaxOpts(opts);
        var self = this;
        var success = opts.success;
        var fail = opts.fail;

        function parseJSON(data) {
            var ret = {};
            if (data && data.length > 0) {
                try {
                    ret = JSON.parse(data);
                } catch (ignore) {}
            }
            return ret;
        }
        this._sendMessage("ajax", opts, function(data) {
            if (data.status == "success") {
                var result = self._mixin( 
                    parseJSON(data.responseText),
                    self._transModel(opts.keys, parseJSON(data.hashJson))
                );
                success && success(result);
            } else {
                fail && fail({
                    code: data.code,
                    errMsg: data.message
                });
            }
        });
    },

    // jump to scheme
    /**
     * 打开新的webview,并关闭原窗口。
     * @method jumpToScheme
     * @param opt {Object}
     * @param opt.url {String} 跳转链接
     * @param opt.extra {Object} 此部分的参数会作为url的query传递
     * @param opt.success {Function}
     * */
    jumpToScheme: function(opt) {
        var url = opt.url;
        var extra = opt.extra;
        if (extra) {
            url += '?' + this._convertUrlParams(extra);
            delete opt.extra;
            opt.url = url;
        }
        opt.toHome = !!opt.toHome ? 1 : 0;
        this._send('jumpToScheme', opt);
    },

    // open efte web
    openEfteWeb: function(opt){
        var handle = opt.handle;
        /*opt = {
            "url":"dpcrm://web",
            "unit": "unit-m-customer",
            "path","add-shop"
        };*/
        this._send('openEfteWeb', opt, function(){
            handle && handle(arguments);
        });
    },

    // get geo location
    /**
     * 获取地理位置信息
     * @method getLocation
     * @param opt {Object}
     * @param opt.success {Function} 获取完毕执行的回调,回调方法中会传入获取到的经度和纬度信息
     * @example
     *      import dpappApollo from 'dpapp-apollo';
     *      dpappApollo.getLocation({
     *          success: function(result){
     *              console.dir(result.lat);
     *              console.dir(result.lng);
     *          }
     *      });
     * */
    getLocation: function(opt) {
        var success = opt.success;
        this._sendMessage('getLocation', opt, function(result) {
            success && success({
                lat: result.lat,
                lng: result.lng
            });
        });
    },
    /**
     * 退出用户登陆
     * @method logout
     * */
    logout: function(){
        this._sendMessage('logout');
    },
    /**
     * 下拉页面刷新,需要配合stopPullDown一起使用
     * @method setPullDown
     * @requires stopPullDown
     * @param opt {Object}
     * @param opt.success {Function} 设置成功后执行
     * @param opt.fail {Function} 设置失败后执行
     * @param opt.handle {Function} 刷新成功后执行
     * @example
     *      import dpappApollo from 'dpapp-apollo';
     *      dpappApollo.setPullDown({
     *          handle: function(){
     *              dpappApollo.ajax({
     *                  url:'',
     *                  success: function(){
     *                      dpappApollo.stopPullDown();
     *                  }
     *              });
     *          }
     *      });
     * */
    setPullDown: function(opt){
        var fail = opt.fail,
            success = opt.success,
            handle = opt.handle;

        this._sendMessage('setPullDown', opt, function(result){
            if(result.status=='success'){
                success && success(result);
            }else if(result.status=='action'){
                handle && handle(result);
            }else{
                fail && fail(result);
            }
        });
    },
    /**
     * 停止下拉刷新,需要配合setPullDown一起使用
     * @method stopPullDown
     * @requires setPullDown
     * @param opt {Object}
     * @param opt.success {Function} 设置成功后执行
     * @param opt.fail {Function} 设置失败后执行
     * @param opt.handle {Function} 刷新成功后执行
     * @example
     *      import dpappApollo from 'dpapp-apollo';
     *      dpappApollo.setPullDown({
     *          handle: function(){
     *              dpappApollo.ajax({
     *                  url:'',
     *                  success: function(){
     *                      dpappApollo.stopPullDown({
     *
     *                      });
     *                  }
     *              });
     *          }
     *      });
     * */
    stopPullDown: function(opt){
        var fail = opt.fail,
            success = opt.success,
            handle = opt.handle;

        this._sendMessage('stopPullDown', opt, function(result){
            if(result.status=='success'){
                success && success(result);
            }else{
                fail && fail(result);
            }
        });
    },
    /**
     * 调用native的图片查看功能展示图片
     * @method showPhoto
     * @since 0.2.9
     * @param opt {Object}
     * @param opt.name {String} 图片名称
     * @param opt.url {String} 图片地址
     * @param opt.success {Function}
     * @param opt.fail {Function}
     * */
    showPhoto: function(opt){
        var fail = opt.fail,
            success = opt.success;
        this._sendMessage('showPhoto', opt, function(result){
            if(result.status=='success'){
                success && success(result);
            }else{
                fail && fail(result);
            }
        });
    },
    /**
     * @method isSupportEIM
     * @private
     * @since 0.3.0
     * @param callback {Function}
     * */
    isSupportEIM: function(callback) {
        this._sendMessage('isSupportEIM', null, function(o) {
            callback(o.value);
            //delete callbacks[cid];
        });
    },
    /**
     * 打开企业QQ
     * @method openEIM
     * @since 0.3.0
     * @param data {Object} 各环境打开的url
     * @example
     *      import dpappApollo from 'dpapp-apollo';
     *      dpappApollo.openEIM({
     *          android:"mqqwpa:\/\/im\/chat?chat_type=wpa&uin=2850297910",
     *          ios:"eimwpa:\/\/im\/chat?chat_type=wpa&uin=2850297910&version=1&src_type=web&web_src=null",
     *          pc:"qqeim:\/\/message?uin=14a3396e3211e36575e5e64086e40359a0d96398df048a14&src=200441309&flag=0&token=55e27e19d8757b47fe103f540267ca5d6788f28fb30e26c38cc3826e0618d3c900d074e31e80d0140768957d4833ec7d"
     *      });
     * */
    openEIM: function(data) {
         var   _this =this;
        if (!data || !data.ios) {
            alert('该用户没有企业QQ');
            return;
        };
        data.iphone = data.ios;
        this.isSupportEIM(function(isSupport) {
            if (isSupport) {

                _this.getDeviceInfo({
                    success: function(info){
                        var url = data[info.agent.toLowerCase() ];
                        if(url){
                            window.location = url;
                        }
                    }
                });

            } else {
                if (confirm('你需要先安装企业QQ才能对话哦,现在去安装吗?')) {
                    window.location = 'http://qyqq.dper.com/download/mobile';
                }
            }
        });
    },
    /**
     * 获取wifi信息
     * @method getWifiInfo
     * @since 0.3.0
     * @param opt {Object}
     * @param opt.success {Function}
     * @param opt.fail {Function}
     * */
    getWifiInfo: function(opt) {
        var fail = opt.fail,
            success = opt.success;
        this._sendMessage('getWifiInfo', {}, function(wifiInfo) {
            if(wifiInfo.status=='success'){
                success && success(wifiInfo);
            }else if(fail){
                fail(wifiInfo.message || '获取WIFI信息失败');

            }else{
                alert(wifiInfo.message || '获取WIFI信息失败');
            }

        });
    },
    /**
     * 获取手机端基本信息
     * @method getDeviceInfo
     * @since 0.3.0
     * @param opt {Object}
     * @param opt.success {Function}
     * @param opt.fail {Function}
     * @example
     *      return {
                  @"os": [[UIDevice currentDevice] systemVersion] ?: @"",
                  @"agent": @"iphone",
                  @"channel": [[NVEnvironment defaultEnvironment] source] ?: @"",
                  @"version": [[NVEnvironment defaultEnvironment] version] ?: @"",
                  @"deviceid": [[NVEnvironment defaultEnvironment] deviceId] ?: @"",
                  @"platform": @"main",
                  @"screen": [self screenSizeString],
                  @"cityid": @([NVCityHelper instance].cityId),
                  @"uuid": [[NVEnvironment defaultEnvironment] deviceId] ?: @"",
                  @"dpid": [[NVEnvironment defaultEnvironment] dpid] ?:@"",
                  @"islogin": @([NVAccountHelper token] != nil),
                  @"lat": @([NVLocateHelper sharedInstance].location.lat),
                  @"lng": @([NVLocateHelper sharedInstance].location.lng),
                  @"address": [self address],
              };
     * }
     * */
    getDeviceInfo: function(opt){
        var fail = opt.fail,
            success = opt.success;
        this._sendMessage('getdeviceinfo', {}, function(info) {

            if(info){
                success &&success(info);
            }else{
                fail && fail();
            }
        });
    }
};
    
Top