/**
 * @author  xfplay tech 201908
 * xfloginSDK对象 可以在网页里面的按钮绑定 sdk.xfLogin()点击跳转到授权页面
 * 初始化 通过options 传递参数进入
 *  sdk.init( {client_id:'607323181031171338', secret_id:'mg8pqcKAG597OF945PHP6385G2M30Iz1', callback: function(ret){
                console.log( xfloginSDK)
                console.log( ret)
        } }) ;  
    在影音先锋App 中，主动弹出授权窗口方式 进行授权登陆sdk.APP_xfLogin ();
   依赖 jQuery 选择器和 xhr ajax功能；
   本js 只能在 registration 插件中使用，因为接口地址 是相对地址；
 * 
 * @type type
 */
var xfloginSDK = (function (sdk, $) {
    var options = {
        client_id: '607323181031171338',
        secret_id: 'mg8pqcKAG597OF945PHP6385G2M30Iz1',
        appPackage: 'test1.xfplay.com',
        scope: 'basic',
        platform: '0',
        backurl: '',
        isdebug : 0
    };
	
    //第三方调用xfplay 的接口api地址
    var baseUrl = '/apps/registration/';
 
    //先锋号的授权页面地址
    var authorize_url = '../index.html#converse/authlogin?';
    //携带参数的先锋号授权地址，用于打开先锋授权页面；
    getAuthorizeUrl = function () {
        //参数顺序要保持这个backurl 一定要再最前；
        return  authorize_url + "backurl=" + options.backurl +
                "&client_id=" + options.client_id +
                "&secret_id=" + options.secret_id +
                "&package=" + options.appPackage;
    }
    //这个是判断设备是苹果还是android；后期要修改成判断浏览器类型
    var platform = "0"; //平台区分 0，安卓平台 1，IOS平台

    var sUserAgent = navigator.userAgent.toLowerCase();
    var isIphone = sUserAgent.match(/iphone/i) == "iphone";
    var isIpad = sUserAgent.match(/iPad/i) == "ipad";
    if (isIphone || isIpad)
        platform = "1";  // IOS平台
    //是否app环境
   getIsApp = function  () {
        var ua = navigator.userAgent.toLowerCase();
     
        if (ua.match(/android/i) == "android") {
            return true;
        }
        if (platform == '1') {
            return true;
        }
        return false;
    }; 
    //获取签名
    getSigna = function (code) {
        var params = {
            grant_type: 'authorization_code',
            client_id: options.client_id,
            appPackage: options.appPackage,
            code: code
        }
        var dkey = new Array();
        for (var key in params) {
            dkey.push(key);
        }
        dkey = dkey.sort();
        var keystr = "", dot = "";
        for (var i = 0; i < dkey.length; i++) {
            keystr += dot + dkey[i] + "=" + params[dkey[i]];
            dot = "&";
        }
        keystr = keystr + "&key=" + options.secret_id;
        console.log(keystr);
        return CryptoJS.MD5(keystr).toString().toUpperCase();
    };
    //获取通过code 获取 access_token
    doGetToken = function (code, signa) {
        signa = signa ||  getSigna(code);
        var url = baseUrl + "auth2/token?"
                + "grant_type=authorization_code"
                + "&client_id=" + options.client_id
                + "&sign=" + signa
                + "&appPackage=" + options.appPackage
                + "&code=" + code;

        $.ajax({
            url: url,
            method: 'get',
            dataType: 'json',
            success: function (data) {
                if(options.isdebug){
                document.getElementById("getToken").innerHTML = data.data.access_token + ",userId:" + data.data.userId + ",refresh_token :" + data.data.refresh_token;
                }
                sdk.codeinfo = $.extend({}, data.data);
                //获取客户信息
                getUserInfo(sdk.codeinfo.access_token, sdk.codeinfo.userId);
            },
            error: function (data) { //执行失败或错误的回调函数
             if(options.isdebug){
                document.getElementById("getToken").innerHTML = "getToken返回错误"; // 临时text显示，可以自定义删除
             }
            }
        });
    }
    /**
     * 用户信息获取
     * @param accessToken
     * @param userId
     */
     getUserInfo = function(accessToken, userId) {

        var url = baseUrl + "api/users/getInfo?access_token=" + accessToken + "&userId=" + userId;

        $.ajax({
            url: url, //访问的链接
            method: "get",
            dataType: "json", //数据格式设置为json
            success: function (data) {  //成功的回调函数
                sdk.userInfo = $.extend({}, data.data);
                // 临时text显示，可以自定义删除
                 if(options.isdebug){
                document.getElementById("getUserinfo").innerHTML = "userId: " + data.data.userId + ",username:" + data.data.username + ",headImage :" + data.data.headImage;
                document.getElementById('img_head').setAttribute('src', 'data:image/png;base64,' + data.data.headImage);
                 }
                //回调函数
                if(typeof options.callback =='function'){
                    options.callback( sdk);
                }
            },
            error: function (e) {
                 if(options.isdebug){
                document.getElementById("getUserinfo").innerHTML = "getUserinfo返回错误"; // 临时text显示，可以自定义删除
                 }
            }
        });
    }
    /**
    * 刷新token
    */
    refreshToken = function() {
    var url = baseUrl + "auth2/refreshToken?refresh_token=" + sdk.codeinfo.refresh_token;

    $.ajax({
        url: url,
        method: 'get',
        dataType: 'json',
        success: function (data) {
             if(options.isdebug){
            document.getElementById("getToken").innerHTML =  data.data.access_token + ",userId:" + data.data.userId; // 临时text显示，可以自定义删除
             }
            sdk.codeinfo = $.extend({}, data.data);
            getUserInfo(sdk.codeinfo.access_token, sdk.codeinfo.userId);
            
        },
        error: function (e) {
             if(options.isdebug){
            document.getElementById("getToken").innerHTML = "refreshToken返回错误"; // 临时text显示，可以自定义删除
             }
        }
    });
}
   //此方法给在 app 内调用app的底层接口 window.openSDK 库
   xfLogin  =  function () {
            var j = {client_id: options.client_id, secret_id: options.secret_id, scope: options.scope};
            var jsInfo = JSON.stringify(j);
            if(typeof options.showloading_func =='function'){
                    options.showloading_func( sdk);
                }
            //拉起app授权，方法名需与app端一致app才能监听，请勿修改方法名
            if (platform == 0) {
                window.openSdk.xfLogin(jsInfo);  //JS与安卓交互
            } else if (platform == 1) {
                window.webkit.messageHandlers.xfLogin.postMessage(jsInfo); //js与Ios交互
            }
        }
 /**
 * app权验证返回xfCode回调监听,方法名需与app端一致才能监听，请勿修改方法名
 * 此方法需要在外部定义一个重名的函数，调用它
 * @param xfcode
 */
  xfcodeCallBack = function(errorCode, result) {//errorcode为0表示返回成功，result会返回正确的Json参数，其它的情况返回为错误提示
     
        if (errorCode == 0) {         
           var json = JSON.parse(result);     
           options.appPackage = json.appPackage;
           getcode(json.xfCode);
        }
 }
 getcode  = function (xfcode) {
  var url = baseUrl + "auth2/authorize?"
        + "response_type=code"
        + "&client_id=" + options.client_id
        + "&scope=" + options.scope
        + "&state=1"
        + "&appPackage=" + options.appPackage
        + "&accessToken=" + xfcode;
 
    $.ajax({
        method: "get",
        url: url, //访问的链接
        dataType: "json",  //数据格式设置为json
        success: function (data) {  //成功的回调函数       
          
            getToken(data.data.code);
        },
        error: function (e) {
            console.log(e);
        }
    });    
 }
 AppDoGetToken = function(code, sign){ 
     /*这个是针对第三方应用 的回调处理地址*/
     window.location.href= options.backurl + "?code="+code;
 }
   // TokenSign返回监听，ios需要异步返回TokenSign
       
 xfTokenSignCallBack  = function (code, sign) {
            AppDoGetToken(code, sign);
        }
 //app端发起一个请求
  getToken = function(code) {
            /**
             *获取TokenSigna，方法名需与app端一致app才能监听返回，请勿修改方法名
             * code
             * grant_type=authorization_code
             */
            if (platform == 0) {
                var signa = window.openSdk.gettoken_signa(code);
                AppDoGetToken(code, signa)
            } else if (platform == 1) {
                window.webkit.messageHandlers.gettoken_sign.postMessage({'code': code, 'secret_id': options.secret_id});
            }
        }
 //初始化对象并返回
    sdk.init = function (param) {
        sdk.options = options = $.extend(options, param);
        //判断打开地址是否携带xfcode ，进入第二步骤去取code
        let xfcode = window.location.href.match(new RegExp(/(^|\?)code=([^&]*)(&|$)/));
        if (xfcode !== null) {
            
            //继续进入后续操作 
            doGetToken(xfcode[2]);
        }
        return sdk;
    };
    //以下是要暴露出来的方法，供其他模块调用
    sdk.xfLogin =  function(){
        window.location.href= getAuthorizeUrl();
        //web情况下点击按钮可以发起
    };
    //app环境下
    sdk.APP_xfLogin = xfLogin;
    
    sdk.refreshToken = refreshToken;
    sdk.xfTokenSignCallBack = xfTokenSignCallBack;
    sdk.xfcodeCallBack = xfcodeCallBack;
    sdk.platform = platform;
    sdk.getIsApp = getIsApp;
 
    return  sdk;
 
})(window.xfloginSDK || {}, jQuery);
/*
if(xfloginSDK.getIsApp()){    
    xfloginSDK.APP_xfLogin();
}
function xfTokenSignCallBack(code, sign) {
     xfloginSDK.xfTokenSignCallBack(code, sign);
}
function xfcodeCallBack(errorCode, result) {     
     xfloginSDK.xfcodeCallBack(errorCode, result);
}   */


