import Emiter from 'Emiter';
import Loger from 'Loger';
import MessageTypes from 'MessageTypes';
import GlobalConfig from 'GlobalConfig';
import MD5 from "md5";
import ApeConsts from 'apes/ApeConsts';
import iphunter from 'iphunter';

import fetchJsonp from 'fetch-jsonp';

// 日志对象
const loger = Loger.getLoger('Sass');

let confInfo = {};
class Sass extends Emiter {
  constructor() {
    super();
  }

  ///////////////////////////////////////Sass 接口///////////////////////////////////////////////////
  //Sass init初始化获取课堂校验信息-----------------------------------------------------------------
  getJoinParams(_initInfo) {
    /* 获取用于加入课堂的参数
     /3m/api/meeting/joinParams.do
     参数 (application/x-www-form-urlencoded):
     名称         类型  可选  默认值 说明
     meetingNumber  String  否       null    课堂号
     userID         String  是        0     用户id
     返回 (application/json):
     code   int 0 正常
     1 课堂号必填
     2 无效的课堂号
     3 没有对应的站点
     4 站点已过期
     siteId String  站点号
     passwordRequired   Boolean 是否需要输入密码
     md5    String  用于后续加入课堂验证
     msType int 媒体服务器类型
     classType 课堂类型
     */
    //let url = `http://${_initInfo.portal}/3m/api/meeting/joinParams.do?meetingNumber=${_initInfo.classId}&userID=${_initInfo.userId}`;
    let url = `${GlobalConfig.locationProtocol+_initInfo.portal}/3m/api/meeting/joinParams.do?meetingNumber=${_initInfo.classId}&userID=${_initInfo.userId}`;
    loger.log('1.初始化init获取课堂校验信息.');
    loger.log(url);
    fetch(url, {
        timeout: 5000
      })
      .then(ret => {
        if (ret.ok) {
          return ret.json();
        } else {
          loger.error(`初始化init获取课堂校验信息-网络异常.状态码:${ret.status}`);
          this._emit(MessageTypes.MCU_ERROR, MessageTypes.ERR_CLASS_INIT_NETWORK);
          throw '';
        }
      })
      .then(ret => {
        //  code    int 0 正常
        // 1 课堂号必填
        //2 无效的课堂号
        //3 没有对应的站点
        //4 站点已过期
        if (ret.code === 0) {
          loger.log('初始化init获取课堂校验信息-完成');
          this._emit(Sass.CLASS_INIT_SUCCESS, ret);
        } else if (ret.code === 1) {
          //loger.warn('Sass获取课堂校验信息失败.');
          this._emit(MessageTypes.MCU_ERROR, MessageTypes.ERR_CLASS_INIT_FAILED_1);
        } else if (ret.code === 2) {
          //loger.warn('Sass获取课堂校验信息失败.');
          this._emit(MessageTypes.MCU_ERROR, MessageTypes.ERR_CLASS_INIT_FAILED_2);
        } else if (ret.code === 3) {
          //loger.warn('Sass获取课堂校验信息失败.');
          this._emit(MessageTypes.MCU_ERROR, MessageTypes.ERR_CLASS_INIT_FAILED_3);
        } else if (ret.code === 4) {
          //loger.warn('Sass获取课堂校验信息失败.');
          this._emit(MessageTypes.MCU_ERROR, MessageTypes.ERR_CLASS_INIT_FAILED_4);
        } else {
          this._emit(MessageTypes.MCU_ERROR, MessageTypes.ERR_CLASS_INIT_FAILED, ret);
        }
      })
      .catch(err => {
        loger.error(`初始化init获取课堂校验信息-异常.状态码:${err}`);
        this._emit(MessageTypes.MCU_ERROR, MessageTypes.ERR_CLASS_INIT_PROTOCOL, err);
      });
  }

  // Sass校验开始-->密码校验(如果需要密码)--->MD5校验----------------------------------------------------
  passwordAndMd5Checking(_param) {
    loger.log('=====================STEP2=======================');
    loger.log('2.开始Sass校验');
    loger.log(_param);
    confInfo = _param;
    // 密码校验
    //课堂如果设置了密码或身份是老师,需要密码校验
    if (confInfo.passwordRequired == 'true' || confInfo.passwordRequired == true||GlobalConfig.isHost) {
      this.sendPWDChecking();
      return;
    }
    // MD5校验
    this.sendMD5Checking();
  }

  // 入会密码校验---------------------------------------------------------------------------------------
  sendPWDChecking() {
    //let url = `http://${classInfo.portal}/3m/getCheckMeetinig.do?siteId=${classInfo.siteId}&classId=${classInfo.classId}&password=${classInfo.password}`;
    /*
     /3m/api/meeting/signIn.do
     siteId  站点号
     classId  课堂号(meetingNumber)
     isTeacher 是否是老师:1 是 0 否
     password 输入的密码
     // 请求格式 http://112.126.80.182/3m/api/meeting/signIn.do?siteId=h5test&classId=526661904&password=111111&isTeacher=0
     */
    //判断是否是老师
    let isTeacher = 0;
    if (confInfo.userRole == ApeConsts.host) {
      isTeacher = 1
    }

    //let url = `http://${confInfo.portal}/3m/api/meeting/signIn.do?siteId=${confInfo.siteId}&classId=${confInfo.classId}&isTeacher=${isTeacher}&password=${confInfo.password}`;
    let url = `${GlobalConfig.locationProtocol+confInfo.portal}/3m/api/meeting/signIn.do?siteId=${confInfo.siteId}&classId=${confInfo.classId}&isTeacher=${isTeacher}&password=${confInfo.password}`;

    loger.log('=====================STEP3=======================');
    loger.log('3.课堂密码校验', url);
    fetch(url, {
        timeout: 5000
      })
      .then(ret => {
        if (ret.status === 200) {
          return ret.text();
        } else {
          loger.error(`课堂密码校验-网络异常.状态码:${ret.status}`);
          this._emit(MessageTypes.MCU_ERROR, MessageTypes.ERR_CLASS_JOIN_NETWORK);
          throw '';
        }
      })
      .then(ret => {
        let rectObj = JSON.parse(ret);
        if (rectObj.flag === 'false' || rectObj.flag === false) {
          loger.error(`课堂密码校验-失败.`);
          this._emit(MessageTypes.MCU_ERROR, MessageTypes.ERR_CLASS_PASSWORD_WRONG);
          return;
        }
        if (rectObj.flag === 'true' || rectObj.flag === true) {
          loger.log(`课堂密码校验-成功.`);
          this.sendMD5Checking();
          return;
        }
        loger.error(`课堂密码校验-协议异常.`, rectObj);
        this._emit(MessageTypes.MCU_ERROR, MessageTypes.ERR_CLASS_JOIN_PROTOCOL);
      })
      .catch(err => {
        loger.error(`课堂密码校验-异常.状态码:${err}`);
        this._emit(MessageTypes.MCU_ERROR, MessageTypes.ERR_CLASS_JOIN_FAILED);
      });
  }

  //MD5校验-----------------------------------------------------------------------------------------
  sendMD5Checking() {
   // let url = `http://${confInfo.portal}/3m/meeting/md5CheckMeeting.do?siteId=${confInfo.siteId}&meetingNumber=${confInfo.classId}&userId=${confInfo.userId}&userName=${confInfo.userName}&userType=${confInfo.userType}&nopassword=${confInfo.passwordRequired}&md5=${confInfo.md5}`;
    let url = `${GlobalConfig.locationProtocol+confInfo.portal}/3m/meeting/md5CheckMeeting.do?siteId=${confInfo.siteId}&meetingNumber=${confInfo.classId}&userId=${confInfo.userId}&userName=${confInfo.userName}&userType=${confInfo.userType}&nopassword=${confInfo.passwordRequired}&md5=${confInfo.md5}`;

    loger.log('=====================STEP4=======================');
    loger.log('4.MD5校验', url);
    fetch(url, {
        timeout: 5000
      })
      .then(ret => {
        if (ret.status === 200) {
          return ret.json();
        } else {
          loger.error(`MD5校验-网络异常.状态码:${ret.status}`);
          this._emit(MessageTypes.MCU_ERROR, MessageTypes.ERR_CLASS_JOIN_NETWORK);
          throw '';
        }
      })
      .then(ret => {
        if (ret.flag == "true" || ret.flag == true) {
          loger.log('MD5校验完成');
          loger.log(ret);
          this._emit(Sass.SUCCESS, ret);
        } else {
          loger.log('MD5校验-失败.');
          this._emit(MessageTypes.MCU_ERROR, MessageTypes.ERR_CLASS_MD5_WRONG);

        }
      })
      .catch(err => {
        loger.error(`MD5校验-异常.状态码:${err}`);
        this._emit(MessageTypes.MCU_ERROR, MessageTypes.ERR_CLASS_JOIN_FAILED);
      });
  }

  // 获取课堂基本详情------------------------------------------------------------------------------------
  getClassDetail() {
   // let url = `http://${GlobalConfig.portal}/3m/meeting/getClassH5.do?classNumber=${GlobalConfig.classId}`;
    let url = `${GlobalConfig.locationProtocol+GlobalConfig.portal}/3m/meeting/getClassH5.do?classNumber=${GlobalConfig.classId}`;

    loger.log('获取Class详情.', url);
    fetch(url, {
        timeout: 5000
      })
      .then(ret => {
        if (ret.ok) {
          return ret.json();
        } else {
          loger.error(`获取Class详情-网络异常.状态码:${ret.status}`);
          this._emit(MessageTypes.MCU_ERROR, MessageTypes.ERR_GET_CLASS_DETAIL);
          throw '';
        }
      })
      .then(ret => {
        if (ret.errorCode === 0) {
          loger.log('获取Class详情完成');
          this._emit(Sass.CLASS_GET_CLASS_DETAIL, ret);
        } else {
          loger.warn('获取Class详情失败.');
          this._emit(MessageTypes.MCU_ERROR, MessageTypes.ERR_GET_CLASS_DETAIL);
        }
      })
      .catch(err => {
        loger.error(`获取Class详情异常.状态码:${err}`);
        this._emit(MessageTypes.MCU_ERROR, MessageTypes.ERR_GET_CLASS_DETAIL);
      });
  }

  //获取课堂课堂的完整信息--------------------------------------------------------------------------------
  getClassParam() {
    /*
     参数 (application/x-www-form-urlencoded):
     名称 类型  可选  默认值 说明
     meetingNumber  String  否   null    课堂号
     timestamp  String  否   null    时间戳
     authId String  否   null    验证信息 md5(meetingNumber + timestamp)
     返回 (application/json):
     名称 类型  说明
     code   int 0 正常
     1 课堂号必填
     2 无效的课堂号
     3 没有对应的站点
     4 站点已过期
     siteId String  站点号
     meetingNumber  String  课堂号 对应的是classId
     */
    let timestamp = new Date().getTime();
    let authId = MD5(GlobalConfig.classId + "" + timestamp); //课堂号+时间戳 的字符串,转成MD5
    //let url = `http://${GlobalConfig.portal}/3m/api/meeting/detail.do?meetingNumber=${GlobalConfig.classId}&timestamp=${timestamp}&authId=${authId}`;
    let url = `${GlobalConfig.locationProtocol+GlobalConfig.portal}/3m/api/meeting/detail.do?meetingNumber=${GlobalConfig.classId}&timestamp=${timestamp}&authId=${authId}`;

    loger.log('=====================STEP5=======================');
    loger.log('5.获取课堂课堂的完整信息 ');
    loger.log(url);
    fetch(url, {
        timeout: 5000
      })
      .then(ret => {
        if (ret.ok) {
          return ret.json();
        } else {
          loger.error(`获取课堂课堂的完整信息-网络异常.状态码:${ret.status}`);
          this._emit(MessageTypes.MCU_ERROR, MessageTypes.ERR_GET_CLASS_PARAML);

          throw '';
        }
      })
      .then(ret => {
        if (ret.code === 0) {
          loger.log('获取课堂课堂的完整信息完成');
          this._emit(Sass.CLASS_GET_CLASS_PARAM, ret);
        } else {
          loger.warn('获取课堂课堂的完整信息 失败.');
          this._emit(MessageTypes.MCU_ERROR, MessageTypes.ERR_GET_CLASS_PARAML);
        }
      })
      .catch(err => {
        loger.error(`获取课堂课堂的完整信息异常.状态码:${err}`);
        this._emit(MessageTypes.MCU_ERROR, MessageTypes.ERR_GET_CLASS_PARAML);
      });
  }

  //删除文档-----------------------------------------------------------------------------------------------------
  /*
   删除课堂中的文档,即删除课堂与文档的关联
   /api/document/deleteRelation.do
   参数
   docId       文档的唯一id
   classId     课堂号
   timestamp   时间戳
   authId       md5(docId+classId+timestamp)
   返回 (application/json):
   0 成功, 1 验证信息错误
   */
  sassDeleteDocument(_param) {
    if (GlobalConfig.isRecordPlayBack) {
      loger.log('录制回放中,能删除文档');
      return;
    }
    let timestamp = new Date().getTime();
    let authId = MD5(_param.docId + "" + _param.classId + "" + timestamp); // docId+classId+timestamp的字符串,转成MD5
    //let url = `http://${GlobalConfig.portal}/3m/api/document/deleteRelation.do?docId=${_param.docId}&classId=${GlobalConfig.classId}&timestamp=${timestamp}&authId=${authId}`;
    let url = `${GlobalConfig.locationProtocol+GlobalConfig.portal}/3m/api/document/deleteRelation.do?docId=${_param.docId}&classId=${GlobalConfig.classId}&timestamp=${timestamp}&authId=${authId}`;

    loger.log('删除文档', url);

    fetch(url, {
        timeout: 5000
      })
      .then(ret => {
        if (ret.ok) {
          return ret.json();
        } else {
          loger.error(`删除文档-网络异常.状态码:${ret.status}`);
          this._emit(MessageTypes.MCU_ERROR, MessageTypes.ERR_DOC_DELETE_FAILED);

          throw '';
        }
      })
      .then(ret => {
        if (ret.code === 0) {
          loger.log('删除文档-完成');
          this._emit(Sass.DELETE_DOCUMENT_SUCCESS, _param);
        } else {
          loger.warn('删除文档-失败.')
          this._emit(MessageTypes.MCU_ERROR, MessageTypes.ERR_DOC_DELETE_FAILED);
        }
      })
      .catch(err => {
        loger.error(`删除文档-异常.状态码:${err}`);
        this._emit(MessageTypes.MCU_ERROR, MessageTypes.ERR_DOC_DELETE_FAILED);
      });
  }

  //删除Music共享文件
  sassDeletMusicShare(_param) {
    if (GlobalConfig.isRecordPlayBack) {
      loger.log('录制回放中,能删除文件');
      return;
    }
    console.warn('删除Music共享实现...');
    let timestamp = new Date().getTime();
    let authId = MD5(_param.fileId + "" + _param.classId + "" + timestamp); // docId+classId+timestamp的字符串,转成MD5
    //let url = `http://${GlobalConfig.portal}/3m/api/media/deleteRelation.do?mediaId=${_param.fileId}&classId=${GlobalConfig.classId}&timestamp=${timestamp}&authId=${authId}`;
    let url = `${GlobalConfig.locationProtocol+GlobalConfig.portal}/3m/api/media/deleteRelation.do?mediaId=${_param.fileId}&classId=${GlobalConfig.classId}&timestamp=${timestamp}&authId=${authId}`;

    loger.log('删除媒体共享文件', url);

    fetch(url, {
        timeout: 5000
      })
      .then(ret => {
        if (ret.ok) {
          return ret.json();
        } else {
          loger.error(`删除媒体共享文件-网络异常.状态码:${ret.status}`);
          this._emit(MessageTypes.MCU_ERROR, MessageTypes.ERR_MUSICSHARE_DELETE_FAILED);

          throw '';
        }
      })
      .then(ret => {
        //code  0 成功, 1 验证信息错误
        if (ret.code === 0) {
          loger.log('删除媒体共享文件 完成');
          this._emit(Sass.DELETE_MUSICSHARE_SUCCESS, _param);
        } else {
          loger.warn('删除媒体共享文件 失败.');
          this._emit(MessageTypes.MCU_ERROR, MessageTypes.ERR_MUSICSHARE_DELETE_FAILED);
        }
      })
      .catch(err => {
        loger.error(`删除媒体共享文件-异常.状态码:${err}`);
        this._emit(MessageTypes.MCU_ERROR, MessageTypes.ERR_MUSICSHARE_DELETE_FAILED);
      });
  }

  //删除媒体共享文件
  sassDeletMediaShare(_param) {
    if (GlobalConfig.isRecordPlayBack) {
      loger.log('录制回放中,能删除文件');
      return;
    }
    let timestamp = new Date().getTime();
    let authId = MD5(_param.fileId + "" + _param.classId + "" + timestamp); // docId+classId+timestamp的字符串,转成MD5
    //let url = `http://${GlobalConfig.portal}/3m/api/sharedMedia/deleteRelation.do?fileId=${_param.fileId}&classId=${GlobalConfig.classId}&timestamp=${timestamp}&authId=${authId}`;
    let url = `${GlobalConfig.locationProtocol+GlobalConfig.portal}/3m/api/sharedMedia/deleteRelation.do?fileId=${_param.fileId}&classId=${GlobalConfig.classId}&timestamp=${timestamp}&authId=${authId}`;

    loger.log('删除媒体共享文件', url);

    fetch(url, {
        timeout: 5000
      })
      .then(ret => {
        if (ret.ok) {
          return ret.json();
        } else {
          loger.error(`删除媒体共享文件-网络异常.状态码:${ret.status}`);
          this._emit(MessageTypes.MCU_ERROR, MessageTypes.ERR_MEDIASHARE_DELETE_FAILED);

          throw '';
        }
      })
      .then(ret => {
        //code  0 成功, 1 验证信息错误
        if (ret.code === 0) {
          loger.log('删除媒体共享文件 完成');
          this._emit(Sass.DELETE_MEDIASHARE_SUCCESS, _param);
        } else {
          loger.warn('删除媒体共享文件 失败.');
          this._emit(MessageTypes.MCU_ERROR, MessageTypes.ERR_MEDIASHARE_DELETE_FAILED);
        }
      })
      .catch(err => {
        loger.error(`删除媒体共享文件-异常.状态码:${err}`);
        this._emit(MessageTypes.MCU_ERROR, MessageTypes.ERR_MEDIASHARE_DELETE_FAILED);
      });
  }

  //保存课堂的当前信息-----------------------------------------------------
  /*保存课堂的当前信息,首次是插入,后面是更新
   /api/meeting/saveInfo.do
   参数(application/x-www-form-urlencoded):
   info Json字符串课堂信息,由前端自己维护
   classId  课堂号
   timestamp  时间戳
   authId  做基本验证,md5(classId+timestamp)

   返回 (application/json):
   code 0 成功  1 课堂号为空 2 无效的课堂号 3 验证信息错误*/

  saveClassStatusInfo(_param) {
    if (GlobalConfig.isRecordPlayBack) {
      loger.log('录制回放中,不需要保存课堂信息');
      return;
    }
    if(!_param||!_param.classStatusInfo){
      return;
    }
    //{"classStatusInfo":classStatusInfo}
    let timestamp = new Date().getTime();
    let authId = MD5(GlobalConfig.classId + "" + timestamp); // (classId+timestamp)的字符串,转成MD5
    _param.classStatusInfo.lastClassActiveTime=timestamp;
    let classStatusInfo = JSON.stringify(_param.classStatusInfo);
    //let url = `http://${GlobalConfig.portal}/3m/api/meeting/saveInfo.do`;
    let url = `${GlobalConfig.locationProtocol+GlobalConfig.portal}/3m/api/meeting/saveInfo.do`;

    //loger.log('saveClassStatusInfo', url);
    fetch(url, {
        method: 'POST',
        headers: {
          "Content-Type": "application/x-www-form-urlencoded"
        },
        body: `classId=${GlobalConfig.classId}&info=${classStatusInfo}&timestamp=${timestamp}&authId=${authId}`,
        timeout: 5000
      })
      .then(ret => {
        if (ret.ok) {
          return ret.json();
        } else {
          loger.error(`saveClassStatusInfo-网络异常.状态码:${ret.status}`);
          //this._emit(MessageTypes.MCU_ERROR,MessageTypes.ERR_DOC_DELETE_FAILED);
          throw '';
        }
      })
      .then(ret => {
        if (ret.code === 0) {
          //loger.log('saveClassStatusInfo 完成');
          this._emit(Sass.CLASS_SAVE_STATUS_INFO_SUCCESS, _param);
        } else if (ret.code === 1) {
          loger.log('saveClassStatusInfo 失败 课堂号为空');
        } else if (ret.code === 2) {
          loger.log('saveClassStatusInfo 失败 无效的课堂号');
        } else if (ret.code === 3) {
          loger.log('saveClassStatusInfo 失败 验证信息错误');
        } else {
          loger.warn('saveClassStatusInfo 失败.', ret);
          //this._emit(MessageTypes.MCU_ERROR,MessageTypes.ERR_DOC_DELETE_FAILED);
        }
      })
      .catch(err => {
        loger.error(`saveClassStatusInfo.状态码:${err}`);
        //this._emit(MessageTypes.MCU_ERROR,MessageTypes.ERR_DOC_DELETE_FAILED);
      });
  }

  //保存录制的信息,主要是录制文件的名称,必须和MCU录制的文件名相同
  saveClassRecordContrlInfo(_param) {
    if (GlobalConfig.isRecordPlayBack) {
      loger.log('录制回放中,不需要保存');
      return;
    }
    // loger.log('保存开始录制信息');
    let key = "3mang123A";
    let siteID = GlobalConfig.siteId;
    let meetingID = GlobalConfig.classId;
    let userID = GlobalConfig.userId;
    let userName = GlobalConfig.userName;
    let meetingName = GlobalConfig.className;
    let startTime = GlobalConfig.classBeginTime;
    let endTime = GlobalConfig.classEndTime;
    let playUrl = "";
    let streamName = GlobalConfig.recordFileName;
    let confRecordFileName = GlobalConfig.recordFileName;
    let downloadUrl = "";
    let recordStatus = GlobalConfig.classStatus;
    let recordTimestamp = GlobalConfig.recordTimestamp;//GlobalConfig.classTimestamp;//使用录制时间,不再使用课堂的进行时间

    let timestamp = new Date().getTime();
    let authId = MD5(key + siteID + meetingID + timestamp);
    //let url = `http://${GlobalConfig.portal}/3m/recordingMeeting/insertRecordingMeeting.do`;
    let url = `${GlobalConfig.locationProtocol+GlobalConfig.portal}/3m/recordingMeeting/insertRecordingMeeting.do`;

    loger.log('保存开始录制信息:', url);

    fetch(encodeURI(url), {
      method: 'POST',
      headers: {
        "Content-Type": "application/x-www-form-urlencoded"
      },
      body: `siteID=${siteID}&meetingID=${meetingID}&userID=${userID}&userName=${userName}&meetingName=${meetingName}&startTime=${startTime}&endTime=${endTime}&playUrl=${playUrl}&streamName=${streamName}&downloadUrl=${downloadUrl}&configFile=${confRecordFileName}&timestamp=${timestamp}&recordTimestamp=${recordTimestamp}&authId=${authId}`,
      timeout: 5000
    })

    .then(ret => {
        if (ret.ok) {
          return ret.json();
        } else {
          loger.error(`保存开始录制信息-网络异常.状态码:${ret.status}`);
          throw '';
        }
      })
      .then(ret => {
        if (ret.errorCode === 0) {
          loger.log('保存开始录制信息 完成');
          this._emit(Sass.CLASS_SAVE_RECORD_INFO_SUCCESS, _param);
        } else {
          loger.warn('保存开始录制信息 失败.', ret);
        }
      })
      .catch(err => {
        loger.error(`保存开始录制信息异常.状态码:${err}`);
      });
  }
  //调用服务器端获取加入音视频通话模块的token
  getChannelKeyToken(_callback){
    if(!GlobalConfig.getChannelToken){
      loger.log("获取channelKey->失败->接口地址无效");
      if(_callback){
        _callback(null);
      }
      return;
    }
   /* let userIpInfo = {
      "appId": key.value,
      "appCertificate": channelKey.value,
      "channel": channel.value,
      "uid": userUid
    }*/
    let url=GlobalConfig.locationProtocol+GlobalConfig.getChannelToken;
    fetch(encodeURI(url), {
      method: 'POST',
      headers: {
        "Content-Type": "application/x-www-form-urlencoded"
      },
      body: `appId=${GlobalConfig.appId}&channel=${GlobalConfig.channelId}&appCertificate=${GlobalConfig.appCertificate}&uid=${GlobalConfig.userUid}`,
      timeout: 4000
    })
      .then(ret => {
        if (ret.ok) {
          return ret.json();
        } else {
          loger.error(`获取channelKey-网络异常.状态码:${ret.status}`);
          if(_callback){
            _callback(null);
          }
          throw '';
        }
      })
      .then(ret => {
        //channelKey :"005AQAoADZBQzk0M0UzMjVGQzgxREU5Njk1REUyRkVFMEYyMkRBRjFCRjIxN0QQANylukzO70ocgrNX9hlkNNWwKDdW9buDA68oN1YAAA=="
        // code: 200
        // uid:"2882341273"
        if (ret.code == 200) {
          loger.log('获取channelKey 完成',ret);
          if(_callback){
            _callback(ret);
          }
        } else {
          loger.warn('获取channelKey 失败.', ret);
          if(_callback){
            _callback(null);
          }
        }
      })
      .catch(err => {
        loger.error(`获取channelKey.状态码:${err}`);
        if(_callback){
          _callback(null);
        }
      });
  }

  //答题卡-------------------------------------------------------
  //创建答题数据
  creatQuestion(_param) {
      if (GlobalConfig.isRecordPlayBack) {
        loger.log('录制回放中->创建答题数据->不做操作');
        return;
      }
      /* {
           "type": 1,//1单选,2多选,3判断,4点名
           "content": "题目",//没有就传""
           "timeLimit": 88,//有效时间(秒)
           "correct": "[]",//正确答案,没有就传[]
           "options": {},//选项数组,没有就传[]
           "option": []//学生选择的答案,没有就传[]
       }*/
      if (!_param) {
        loger.warn('创建答题数据->参数错误->param:', _param);
        this._emit(Sass.SASS_CREAT_QUESTION_FAILED);
        return;
      }
      let classId = GlobalConfig.classId; //课堂号
      let timestamp = new Date().getTime();
      let authId = MD5(classId + "" + timestamp);

      let type = parseInt(_param.type); //1单选,2多选,3判断,4点名
      let content = _param.content || "";
      let timeLimit = parseInt(_param.timeLimit);
      let correct = _param.correct.toString();
      let options = JSON.stringify(_param.options);

      //let url = `http://${GlobalConfig.portal}/3m/api/question/add.do`;
      let url = `${GlobalConfig.locationProtocol+GlobalConfig.portal}/3m/api/question/add.do`;
      loger.log('创建答题数据', url);

      fetch(encodeURI(url), {
        method: 'POST',
        headers: {
          "Content-Type": "application/x-www-form-urlencoded; charset=utf-8"
        },
        //classId=1&timestamp=2&authId=3&content=&options=["A","B","C","D"]&type=1&correct=0&timeLimit=60
        body: `classId=${classId}&timestamp=${timestamp}&authId=${authId}&content=${content}&options=${options}&type=${type}&correct=${correct}&timeLimit=${timeLimit}`,
        timeout: 5000
      })

      .then(ret => {
          if (ret.ok) {
            return ret.json();
          } else {
            loger.error(`创建答题数据-网络异常.状态码:${ret.status}`);
            this._emit(Sass.SASS_CREAT_QUESTION_FAILED);
            throw '';
          }
        })
        .then(ret => {
          if (ret.code == 0) {
            //errorCode int  0 正常  1 没有指定的课堂 4 验证信息错误(authId)
            // {"code":0,"id":1}
            let question = {};
            question.questionId = ret.id;
            question.type = type;
            question.content = _param.content || [];
            question.timeLimit = timeLimit;
            question.correct = _param.correct || [];
            question.options = _param.options || [];
            loger.log('创建答题数据->完成->', question);
            this._emit(Sass.SASS_CREAT_QUESTION_SUCCESS, question);
          } else {
            loger.warn('创建答题数据->失败.', ret);
            this._emit(Sass.SASS_CREAT_QUESTION_FAILED);
          }
        })
        .catch(err => {
          loger.error(`创建答题数据->状态码:${err}`);
          this._emit(Sass.SASS_CREAT_QUESTION_FAILED);
        });
    }
    //保存答题数据
  sendAnswer(_param) {
      if (GlobalConfig.isRecordPlayBack) {
        loger.log('录制回放中->保存答题数据->不做操作');
        return;
      }
      if (!_param) {
        loger.warn('保存答题数据->参数错误->param:', _param);
        this._emit(Sass.SASS_SEND_ANSWER_FAILED);
        return;
      }
      /*classId String课堂号
      timestamp 时间戳
      authId String验证信息md5(classId+timestamp)

      questionId    long 题目id
      answer    String 选择的选项的索引,如果是多选,用英文逗号分隔。例如:'0,3'
      userId    String 用户id
      userName  String 用户名字*/

      let classId = GlobalConfig.classId; //课堂号
      let timestamp = new Date().getTime();
      let authId = MD5(classId + "" + timestamp);

      let type = parseInt(_param.type); //1单选,2多选,3判断,4点名

      let questionId = parseInt(_param.questionId); //题目id
      let answer = _param.answer.toString();
      let userId = _param.userId;
      let userName = _param.userName;

     // let url = `http://${GlobalConfig.portal}/3m/api/question/answer.do`;
      let url = `${GlobalConfig.locationProtocol+GlobalConfig.portal}/3m/api/question/answer.do`;
      loger.log('保存答题数据', url);

      fetch(encodeURI(url), {
        method: 'POST',
        headers: {
          "Content-Type": "application/x-www-form-urlencoded; charset=utf-8"
        },
        //classId=1&timestamp=2&authId=3&questionId=1&answer=0&userId=111&userName=zhang3
        body: `classId=${classId}&timestamp=${timestamp}&authId=${authId}&questionId=${questionId}&answer=${answer}&userId=${userId}&userName=${userName}`,
        timeout: 5000
      })

      .then(ret => {
          if (ret.ok) {
            return ret.json();
          } else {
            loger.error(`保存答题数据-网络异常.状态码:${ret.status}`);
            this._emit(Sass.SASS_SEND_ANSWER_FAILED);
            throw '';
          }
        })
        .then(ret => {
          if (ret.code == 0) {
            // 0 正常 1 没有指定的课堂  4 验证信息错误(authId) 5 没有指定的题目 6 题目不属于该课堂
            //{"code":0}
            let question = _param;
            loger.log('保存答题数据->完成');
            this._emit(Sass.SASS_SEND_ANSWER_SUCCESS, question);
          } else {
            loger.warn('保存答题数据->失败.', ret);
            this._emit(Sass.SASS_SEND_ANSWER_FAILED);
          }
        })
        .catch(err => {
          loger.error(`保存答题数据->状态码:${err}`);
          this._emit(Sass.SASS_SEND_ANSWER_FAILED);
        });
    }
    //查询题目数据
  getQuestion(_param) {
      if (GlobalConfig.isRecordPlayBack) {
        loger.log('录制回放中->查询题目数据->不做操作');
        return;
      }
      if (!_param) {
        loger.warn('查询题目数据->参数错误->param:', _param);
        this._emit(Sass.SASS_GET_QUESTION_FAILED);
        return;
      }
      //questionId   long    题目id

      let questionId = parseInt(_param.questionId); //题目id
     // let url = `http://${GlobalConfig.portal}/3m/api/question/get.do`;
    let url = `${GlobalConfig.locationProtocol+GlobalConfig.portal}/3m/api/question/get.do`;
    loger.log('查询题目数据', url);
      //接口中用的是GET
      fetch(encodeURI(url), {
        method: 'POST',
        headers: {
          "Content-Type": "application/x-www-form-urlencoded; charset=utf-8"
        },
        body: `questionId=${questionId}`,
        timeout: 5000
      })

      .then(ret => {
          if (ret.ok) {
            return ret.json();
          } else {
            loger.error(`查询题目数据-网络异常.状态码:${ret.status}`);
            this._emit(Sass.SASS_GET_QUESTION_FAILED);
            throw '';
          }
        })
        .then(ret => {
          if (ret.code == 0) {
            //0 正常 5 没有指定的题目
            //{"timeLimit":90,"code":0,"options":"[\"A\",\"B\",\"C\"]","id":22,"type":2,"content":"题目"}
            loger.log('查询题目数据->完成');
            let question = {};
            question.questionId = ret.id || questionId;
            question.type = ret.type;
            question.timeLimit = ret.timeLimit;
            question.options = ret.options;
            question.content = ret.content;

            this._emit(Sass.SASS_GET_QUESTION_SUCCESS, question);
          } else {
            loger.warn('查询题目数据->失败.', ret);
            this._emit(Sass.SASS_GET_QUESTION_FAILED);
          }
        })
        .catch(err => {
          loger.error(`查询题目数据->状态码:${err}`);
          this._emit(Sass.SASS_GET_QUESTION_FAILED);
        });
    }
    //查询答题结果数据
  getQuestionResult(_param) {
    if (GlobalConfig.isRecordPlayBack) {
      loger.log('录制回放中->查询答题结果数据->不做操作');
      return;
    }
    if (!_param) {
      loger.warn('查询答题结果数据->参数错误->param:', _param);
      this._emit(Sass.SASS_GET_QUESTION_RESULT_FAILED);
      return;
    }
    //questionId   long    题目id

    let questionId = parseInt(_param.questionId); //题目id
    //let url = `http://${GlobalConfig.portal}/3m/api/question/results.do`;
    let url = `${GlobalConfig.locationProtocol+GlobalConfig.portal}/3m/api/question/results.do`;
    loger.log('查询答题结果数据', url);

    fetch(encodeURI(url), {
      method: 'POST',
      headers: {
        "Content-Type": "application/x-www-form-urlencoded; charset=utf-8"
      },
      body: `questionId=${questionId}`,
      timeout: 5000
    })

    .then(ret => {
        if (ret.ok) {
          return ret.json();
        } else {
          loger.error(`查询答题结果数据-网络异常.状态码:${ret.status}`);
          this._emit(Sass.SASS_GET_QUESTION_RESULT_FAILED);
          throw '';
        }
      })
      .then(ret => {
        if (ret.code == 0) {
          //int 0 正常5  没有指定的题目
          /* list   array   数组
           userId string 用户id
           userName string  用户姓名
           answer  string 答案。选项的索引,多个时用逗号分隔
           {"timeLimit":0,"content":"test question","id":11,"code":0,"type":3,"options":"["True", "False"]"}*/

          loger.log('查询答题结果数据->完成');
          let result = _param || {};
          result.questionId = questionId;
          result.list = ret.list;
          this._emit(Sass.SASS_GET_QUESTION_RESULT_SUCCESS, result);
        } else {
          loger.warn('查询答题结果数据->失败.', ret);
          this._emit(Sass.SASS_GET_QUESTION_RESULT_FAILED);
        }
      })
      .catch(err => {
        loger.error(`查询答题结果数据->状态码:${err}`);
        this._emit(Sass.SASS_GET_QUESTION_RESULT_FAILED);
      });
  }
  //点名---------------------------------------------------------


  //获取课堂保存的信息
  getClassRecordInfo(_callback){
    //http://networkschool.xuedianyun.com/server/recordInfo/getOldRecordInfo
    let path="networkschool.xuedianyun.com/server/recordInfo/getOldRecordInfo";
    let url = `${GlobalConfig.locationProtocol+path}`;
    loger.log('获取课堂保存的状态信息', url);
    //接口中用的是GET
    fetch(encodeURI(url), {
      method: 'POST',
      headers: {
        "Content-Type": "application/x-www-form-urlencoded; charset=utf-8"
      },
      body: `meetingNumber=${ GlobalConfig.classId}`,
      timeout: 5000
    })
      .then(ret => {
        if (ret.ok) {
          return ret.json();
        } else {
          loger.error(`获取课堂保存的状态信息-网络异常.状态码:${ret}`);
          if(_callback){
            _callback();
          }
          throw '';
        }
      })
      .then(ret => {
        loger.log('获取课堂保存的状态信息-完成');
        /* {
         "code": 200,
         "returnData": {
         "data": {
         "id": 28,
         "meeting_number": "1170105412",
         "info": "{\"siteId\":\"h5dev\",\"classId\":1170105412,\"className\":\"mcuClientSdk20170318\",\"classType\":1,\"classStatus\":2,\"classStartTime\":\"2017-3-24-20-9-56\",\"classStopTime\":\"2017-3-28-22-20-56\",\"classTimestamp\":25402,\"recordPlaybackMaxTime\":0,\"classBeginTime\":\"2017-03-18 19:00:00\",\"classEndTime\":\"2017-03-29 21:00:00\",\"recordStatus\":false,\"recordTimestamp\":0,\"recordFileName\":\"h5dev/20170318/1170105412_20170318.rec\",\"recordDownloadUrl\":\"\",\"serverTimestamp\":1490710856,\"activeDocId\":666519474,\"activeDocCurPage\":1}",
         "create_time": "2017-03-18T21:12:19.000Z"
         }
         }
         }*/
        if(ret&&ret.code==200){
          try{
            if(ret.returnData&&ret.returnData.data){
              if(_callback) {
                _callback(ret.returnData.data.info);
              }
            }
          }catch (err){
            if(_callback){
              _callback();
            }
          }

        }else {
          if(_callback){
            _callback();
          }
        }
      })
      .catch(err => {
        loger.error(`AGOR-获取媒体录制信息-异常.状态码:${err}`);
        if(_callback){
          _callback();
        }
      });
  }
}

Sass.prototype.SUCCESS = Sass.SUCCESS = 'Sass_success';
Sass.prototype.CLASS_INIT_SUCCESS = Sass.CLASS_INIT_SUCCESS = 'sass_class_init_success';
Sass.prototype.CLASS_GET_CLASS_PARAM = Sass.CLASS_GET_CLASS_PARAM = 'sass_class_getClassParam.message';
Sass.prototype.CLASS_GET_CLASS_DETAIL = Sass.CLASS_GET_CLASS_DETAIL = 'sass_class_getClassDetail_message';
Sass.prototype.DELETE_DOCUMENT_SUCCESS = Sass.DELETE_DOCUMENT_SUCCESS = 'sass_class_deleteDocumentSuccess_message'; //删除文档成功
Sass.prototype.DELETE_MEDIASHARE_SUCCESS = Sass.DELETE_MEDIASHARE_SUCCESS = 'sass_class_deleteMediaShareSuccess_message'; //删除文档成功
Sass.prototype.DELETE_MUSICSHARE_SUCCESS = Sass.DELETE_MUSICSHARE_SUCCESS = 'sass_class_deleteMusicShareSuccess_message'; //删除文档成功

Sass.prototype.CLASS_SAVE_STATUS_INFO_SUCCESS = Sass.CLASS_SAVE_STATUS_INFO_SUCCESS = 'sass_class_saveClassStatusInfoSuccess_message'; //保存课堂状态信息
Sass.prototype.CLASS_SAVE_RECORD_INFO_SUCCESS = Sass.CLASS_SAVE_RECORD_INFO_SUCCESS = 'sass_class_saveClassRecordInfoSuccess_message'; //保存录制课堂信息

//答题卡和点名
Sass.prototype.SASS_CREAT_QUESTION_SUCCESS = Sass.SASS_CREAT_QUESTION_SUCCESS = 'sass_creat_question_success'; //创建答题卡问题成功
Sass.prototype.SASS_CREAT_QUESTION_FAILED = Sass.SASS_CREAT_QUESTION_FAILED = 'sass_creat_question_failed'; //创建答题卡失败

Sass.prototype.SASS_GET_QUESTION_SUCCESS = Sass.SASS_GET_QUESTION_SUCCESS = 'sass_get_question_success'; //获取问题成功
Sass.prototype.SASS_GET_QUESTION_FAILED = Sass.SASS_GET_QUESTION_FAILED = 'sass_get_question_failed'; //获取问题失败

Sass.prototype.SASS_GET_QUESTION_RESULT_SUCCESS = Sass.SASS_GET_QUESTION_RESULT_SUCCESS = 'sass_get_question_result_success'; //获取问题结果成功
Sass.prototype.SASS_GET_QUESTION_RESULT_FAILED = Sass.SASS_GET_QUESTION_RESULT_FAILED = 'sass_get_question_result_failed'; //获取问题结果失败

Sass.prototype.SASS_SEND_ANSWER_SUCCESS = Sass.SASS_SEND_ANSWER_SUCCESS = 'sass_send_answer_success'; //保存答案成功
Sass.prototype.SASS_SEND_ANSWER_FAILED = Sass.SASS_SEND_ANSWER_FAILED = 'sass_send_answer_failed'; //保存答案失败

export default new Sass;