/*
 * @author 张志成
 * @description 凯特usb证书方法
 * @create 20181211
 */
/* eslint-disable */
import Vue from 'vue';

const vm = new Vue();
let pluginRequestID = 0;

// IE浏览器环境，登录/绑定c
const getCertBsf = (serRand) => {
    const obj = document.getElementById('obj');
    let ret = '';
    // 调用凯特证书登录方法
    ret = obj.SOF_Login('', '');
    if (ret !== 0) {
        vm.$message.error('未检测到UKey或Ukey未登陆');
        // alert(obj.SOF_GetReturnString());
        return false;
    }
    // 获取用户证书列表
    // 返回值格式如下 ==> 用户1||标识1 &&& 用户2||标识2 &&& ...
    ret = obj.SOF_GetUserList();
    if (ret === '') {
        vm.$message.error('获取用户证书列表失败');
        // alert(obj.SOF_GetReturnString());
        return false;
    }
    const len = ret.length;
    const len2 = '38';
    const str2 = ret.substr(len - len2, len2);
    const CertID = str2;
    // 根据标识导出用户签名证书
    ret = obj.SOF_ExportUserCert(CertID);
    if (ret === '') {
        vm.$message.error('获取用户证书失败');
        // alert(obj.SOF_GetReturnString());
        return false;
    }
    // 对serRand原文进行数字签名加密，CertID是加密证书
    const sign = obj.SOF_SignData(CertID, serRand);
    if (sign === '') {
        vm.$message.error('原文加密失败');
        // alert(obj.SOF_GetReturnString());
        return false;
    }
    const params = {
        strData: serRand,
        strSign: sign,
        strCert: ret
    };
    return params;
};

/*
 * @author 张志成
 * @description IE10及以上浏览器环境，登录/绑定ca，通过socket建立通信
 * @create 2018-12-13
 * @param [serR] 后端返回的随机数
 * @param [cb] 自定义open事件的回调
 * @param [url] 自定义socket远程连接地址，31212端口用于验证、31213端口用于签章
 * @param [serR] 后端返回的随机数
 * @param [PluginRequest] 凯特api请求的类型，如下：
 * @param [Batch_SignData] 根据随机数与证书签名加密的api
 * @params [onBatch_EnvelopeDataByP7] 对原文进行加密的api
 * @params [onBatch_UnenvelopeDataByP7] 对密文进行解密的api
 */
const getCertBsfNoIE = (serR, cb, url) => {
    // socket地址
    const host = url || 'ws://127.0.0.1:31212/';
    // 建立socket通信
    const socket = new WebSocket(host);
    try {
        // socket连接成功
        // eslint-disable-next-line
        socket.onopen = (msg) => {
            console.log('CA连接成功！');
            if (serR) {
                pluginRequestID += 1;
                const req = {
                    PluginRequestID: pluginRequestID,
                    PluginRequest: 'Batch_SignData',
                    InData: serR
                };
                socket.send(JSON.stringify(req));
            } else {
                cb();
            }
            
        };
        // 通信关闭
        // eslint-disable-next-line
        socket.onclose = (msg) => {
            console.log('socket closed!');
            vm.$message.error('未检测到SscSeal客户端');
        };
        // 通信异常
        // eslint-disable-next-line
        socket.onerror = (msg) => {
            console.log('socket error!');
            vm.$message.error('未检测到SscSeal客户端');
        };
        return socket; // 返回定义好的socket实例
    } catch (error) {
        alert(error.message);
        return false;
    }
};

/*
 * @author 张志成
 * @description 非IE环境加密的方法
 * @create 2018-12-13
 * @param [socket] socket实例
 * @param [original] 原文
 */
const onBatchEnvelopeDataByP7 = (socket, original, rcptCert) => {
    pluginRequestID += 1;
    const req = {
        PluginRequestID: pluginRequestID,
        PluginRequest: 'Batch_EnvelopeDataByP7',
        InData: original,
        RcptCerts: rcptCert
    };
    socket.send(JSON.stringify(req));
};

/*
 * @author 张志成
 * @description 非IE环境解密的方法
 * @create 2018-12-13
 * @param [socket] socket实例
 * @param [ciphertext] 密文
 */
const onBatchUnenvelopeDataByP7 = (socket, ciphertext) => {
    pluginRequestID += 1;
    const req = {
        PluginRequestID: pluginRequestID,
        PluginRequest: 'Batch_UnenvelopeDataByP7',
        InData: ciphertext
    };
    socket.send(JSON.stringify(req));
};

/*
 * @author 张志成
 * @description 获取序列号
 * @create 2018-12-13
 * @param [socket] socket实例
 * @param [ciphertext] 密文
 */
const getSerialNumber = (socket, Cert) => {
    pluginRequestID +=1;
    const req = {
        PluginRequestID: pluginRequestID,
        PluginRequest: 'SOF_GetCertInfo',
        Cert,
        Type: '0x00000002'
    };
    socket.send(JSON.stringify(req));
};

/*
 * @author 张志成
 * @description 查看edc文件
 * @create 2018-12-29
 * @param [socket] socket实例
 * @param [url] edc文件地址
 */
const onSeal = (socket, url) => {
    pluginRequestID += 1;
    const req = {
        PluginRequestID: pluginRequestID,
        PluginRequest: 'Seal',
        InFile: url,
        OutFile: '000',
        PDFCommand: 13,
        AutoCloseDocument: true,
        rightAllButton: 382
    };
    socket.send(JSON.stringify(req));

    return new Promise((resolve, reject) => {
        this.$fetch(item.fileBefore).then(res => {
            if (!res) {
                this.$message.error('当前存在执行中的任务，无法上传');
                return reject();
            }
            return resolve();
        });
    });
   
    
};


/*
 * @author 张志成
 * @description 格式化生成接口参数
 * @create 2018-12-13
 */
const dealWithResponseMessage = (respMessage, serR) => {
    // 格式化响应消息
    const resp = JSON.parse(respMessage);
    // 处理登录/绑定ca的场景
    if (resp.PluginResponseValue.length > 0
        && resp.PluginRequest === 'Batch_SignData') {
        // 格式：签名值||证书数据
        const str = resp.PluginResponseValue;
        const pos = str.indexOf('||');
        if (pos === -1) {
            vm.$message.error('响应消息格式错误');
            return false;
        }
        // 证书数据
        const textCert = str.substr(pos + 2);
        // 签名值
        const textSign = str.substr(0, pos);
        const params = {
            strData: serR,
            strSign: textSign,
            strCert: textCert // 序列号
        };
        return params; // 返回的参数对象
    // 加/解密的结果直接返回
    } else if (resp.PluginResponseValue.length > 0) {
        return resp.PluginResponseValue;
    }
    return false;
};

export {
    getCertBsf,
    dealWithResponseMessage,
    getSerialNumber,
    getCertBsfNoIE,
    onBatchEnvelopeDataByP7,
    onBatchUnenvelopeDataByP7,
    onSeal
};
