import fetch from '@/utils/fetch'
import { getBaseUrl, getReportUrl, getWorkApi } from '@/utils/index'
import { CryptoJS } from '@/plugins/aes'
import 'jsencrypt'

import { getPubKey } from '@/utils/account/accountApi';

let pubKey = "";

module.exports = {
    data: function () {
        return {
            token: null
        }
    },
    created: function () {
      //  let query = this.$router.query
        // this.token = this.getUrlSearch(location.href, 'token') || (query && query.token) || null
      //  this.token = this.getUrlKey('token') || (query && query.token) || null
    },
    mounted: function() {
      
    },
    methods: {

        // generate key
        getAesKey(len) {
            len = len || 16;
            var aesKey = "";
            var strList = "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ";
            var strLen = strList.length;
            for(var i=0; i<len; i++){
            aesKey += strList.charAt( Math.floor( Math.random()*strLen ) );
            };
            return aesKey;
        },
        // 加密传参,发送请求
        sendEncryptRequest(content, cb){
            content = JSON.stringify(content);  // 后端要求转 string
            // debugger;
            if(pubKey){  // pubKey获取过就不用再获取了
                let params = this.formatContent(content, pubKey);
                cb && cb(params);
            }else{
                this.handleGetPubKey(content, cb);
            }
        },
        // get public key
        handleGetPubKey(content, cb){
            getPubKey().then(res => {
                // console.log('>>>>>>>>>>>>>>>>>>>> publicKey: ', res)
                if(res.code == '000000'){
                    pubKey = res.data;
                    if(cb){
                        let params = this.formatContent(content, pubKey);
                        cb && cb(params);
                    }
                }else{
                    this.$message({  
                        message: (res && res.message) || '接口出错',
                        type: 'warning'
                    });
                }
            })
        },
        // format account params
        formatContent(content, pubKey) {  // obj为具体的json传参
            let aesKey = this.getAesKey(16);
            // console.log('AES key::::::: ', aesKey)
            let params = {
                key: '',
                content: ''
            };
            // 开发阶段后端接口还没处理加密，先传 原始json数据 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! 后端加密OK后 再用下面的注释代码
            // params.content = content;
            params.content = this.AesEncrypt(content, aesKey);
            params.key = this.RsaEncrypt(aesKey, pubKey);
            return params;
        },
        // AES encrypt
        AesEncrypt(content, aesKey) {
            let sKey = CryptoJS.enc.Utf8.parse(aesKey);
            let sContent = CryptoJS.enc.Utf8.parse(content);
            let encrypted = CryptoJS.AES.encrypt(sContent, sKey, {mode:CryptoJS.mode.ECB,padding: CryptoJS.pad.Pkcs7});
            return encrypted.toString();
        },
        // RSA encrypt
        RsaEncrypt(aesKey, pubKey){  
            let _encrypt = new JSEncrypt();
            let boss_public_key = pubKey;
            _encrypt.setPublicKey(boss_public_key);
            let encrypted = _encrypt.encrypt(aesKey);
            return encrypted;
        },

        getUrlPara(obj) {
            let dataStr = ''
            let list = [];
            for (let attr in obj) {
                if (obj.hasOwnProperty(attr) && attr != 'data') {
                    list.push(attr + '=' + obj[attr])
                }
            }
            dataStr = list.join('&')
            if (dataStr !== '') {
                return '?' + dataStr
            }
            return ''
        },

        setRouterParm(paramList){
            let parm = {};
            if(paramList.length<=1){
                return '';
            }
            for(let i=1;i<paramList.length;i++){
                parm[paramList[i].key] = paramList[i].value;
            }
            return parm;
        },

        // 拼接多个参数
        getUrlParmByCode(paramList) {
            if ( paramList.length <= 1) {
                return ''
            }
            let dataStr = ''
            let list = [];
            for( let i = 1; i < paramList.length; i ++) {
                list.push(paramList[i].key + '=' + paramList[i].value)
            }
            dataStr = list.join('&')
            if (dataStr !== '') {
                return '?' + dataStr
            }
            return ''
        },
        //处理五分钟数据 初始化播放状态
        handelFive(d) {
            for (let i = 0; i < d.length; i++) {
                d[i].play = '0';
            }
            return d;
        },

        // 根据条件排序
        async searchForOrder(searchCategory = '1', searchValue = '', sortItem = 1, pageSize = 10, sourceData = []) {
            if(pageSize <=0 ) return;
            let str2 = (searchValue || '').replace(/[\-\_\,\!\|\~\`\(\)\#\$\%\^\&\*\{\}\:\;\"\L\<\>\?]/g, '');// 去掉特殊字符
            let _this = this,
                para = {
                    searchCategory: searchCategory,
                    searchValue: str2,
                    keywordColor: 'rgba(244,122,72,1)',
                    sortItem: sortItem,
                    pageNo: 1,
                    pageSize: pageSize,
                    token: _this.token,
                    setEntry: 'headers',
                }
            let url = 'contents/searchKeyword/searchContent'
      
            let csourceData = await this.GET(url, para).then(res => {
                // _this.searchText = ''
                if (res.code == '000000') {
                    // 课程
                    if(searchCategory.indexOf('1') >= 0) {
                        sourceData = (res.data && res.data.contentAppModels) || []
                    }
                    if(searchCategory.indexOf('2') >= 0) {
                        // sourceData = []
                        sourceData = this.handelFive(res.data.fiveMinutesMedicalContentList || [])
                    }
                    if(searchCategory.indexOf('3') >= 0) {
                        sourceData = (res.data && res.data.pCourseDoctorModels) || []
                    }
                    if(searchCategory.indexOf('4') >= 0) {
                        sourceData = res.data.educationContents
                    }
                }
                return sourceData || []
            })
            return csourceData
        },
      
        setEventByModuleCode(itemData){
            let modeCode = itemData.appModuleInfo.code || '';
            let paramList = itemData.appModuleInfo.paramList ? itemData.appModuleInfo.paramList : ''

            if( modeCode === 'M001' || modeCode === 'M002' || modeCode === 'M003') {
                paramList = ''
            }else if( modeCode === 'M100' || modeCode === 'M300' ) {
                // 支持多个参数
                let urlPara = this.getUrlParmByCode(paramList);
                if(paramList[0]){
                    if( paramList[0].value.indexOf("?") == -1){
                        paramList[0].value += urlPara
                    }
                }
            } else if (modeCode === 'M400') {
                // debugger
                let path = paramList[0]['key'];
                let v = paramList[0]['value'];
                let query = this.setRouterParm(paramList);
                paramList = [{
                    url:v,
                    query:query
                }]
                this.$router.push({
                    path: v,
                    query: query
                })
                //alert(this.token);
               return 'NO'
            }
            if(typeof paramList === 'string' && !paramList){
                paramList = []
            }
            return paramList;
        },

        // 通用GET请求
        GET(api, para, callback,str) {
           // para.token = para.token || this.token || "343BCABC890349ACAF357FA79122F9FE"
            let url = api + this.getUrlPara(para)
            url = encodeURI(url);
            return fetch({
                url: getBaseUrl(url),
                method: 'get',
                data: para
            })
        },
        reportGET(api, para, callback,str) {
            // para.token = para.token || this.token || "343BCABC890349ACAF357FA79122F9FE"
             let url = api + this.getUrlPara(para)
             url = encodeURI(url);
             return fetch({
                 url: getReportUrl(url),
                 method: 'get',
                 data: para
             })
         },
        // saas-GET请求
        saasGET(api, para) {
          // para.token = para.token || this.token || "343BCABC890349ACAF357FA79122F9FE"
          return fetch({
            headers: {
              sysCode: 9,
            },
            url: getWorkApi(api),
            method: 'get',
            params: para
          })
        },

        // 通用DELETE请求
        DELETE(api, para, callback,str) {
            // para.token = para.token || this.token || "343BCABC890349ACAF357FA79122F9FE"
            let url = api + this.getUrlPara(para)
            return fetch({
                url: getBaseUrl(url),
                method: 'delete',
                data: para
            })
        },
        // 通用PUT请求
        PUT(api, para, callback) {
            // para.token = para.token || this.token || "343BCABC890349ACAF357FA79122F9FE"
            return fetch({
                url: getBaseUrl(api),
                method: 'put',
                data: para
            })
        },
        // 通用POST请求
        POST(api, para, callback) {
            // para.token = para.token || this.token || "343BCABC890349ACAF357FA79122F9FE"
            return fetch({
                url: getBaseUrl(api),
                method: 'post',
                data: para
            })
        },
        reportPOST(api, para, callback) {
            // para.token = para.token || this.token || "343BCABC890349ACAF357FA79122F9FE"
            return fetch({
                url: getReportUrl(api),
                method: 'post',
                data: para
            })
        },
        // 通用saas-POST请求
        saasPOST(api, para, cType) {
          // para.token = para.token || this.token || "343BCABC890349ACAF357FA79122F9FE"
          let header = {}
          if(cType) {
            header['Content-Type'] = cType;
          }
          return fetch({
            headers: {
              sysCode: 9,
              ...header
            },
            url: getWorkApi(api),
            method: 'post',
            data: para
          })
        },
      // 通用saas-PUT请求
      saasPUT(api, para) {
        return fetch({
          headers: {
            sysCode: 9,
          },
          url: getWorkApi(api),
          method: 'put',
          data: para
        })
      },
        // 从html参数
        getUrlKey(name) {
            if (decodeURIComponent && location.href) {
                return decodeURIComponent((new RegExp('[?|&]' + name + '=' + '([^&;]+?)(&|#|;|$)').exec(location.href) || [, ""])[1].replace(/\+/g, '%20')) || null
            } else {
                return null
            }
        },

        getUrlSearch(url, name) {
            if (typeof name == 'undefined') {
                name = url
                url = location.href
            }
            var reg = new RegExp("(^|&)" + name + "=([^&]*)(&|$)", "i");
            var r = url.slice(url.indexOf('?') + 1).match(reg);
            if (r != null) {
                try {
                    return decodeURIComponent(r[2]);
                } catch (_e) {
                    return null
                }
            }
            return null
        }

    }
}
