import Emiter from 'Emiter';
import Loger from 'Loger';
import MessageTypes from 'MessageTypes';
import GlobalConfig from 'GlobalConfig';
import MD5 from "md5";
// 日志对象
const loger = Loger.getLoger('Sass');

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

  //Sass 接口
  //----1.校验之前的接口-----
  //getJoinParams 获取课堂校验信息     let url = `http://${_initInfo.portal}/3m/api/meeting/joinParams.do?meetingNumber=${_initInfo.classId}&userID=${_initInfo.userId}`;

  //-----2.开始校验,如果有密码先校验密码,否则直接开始MD5验证-----
  //sendPWDChecking入会密码校验                let url = `http://${classInfo.portal}/3m/getCheckMeetinig.do?siteId=${classInfo.siteId}&classId=${classInfo.classId}&password=${classInfo.password}`;
  //sendMD5Checking MD5校验(发起入会)          let url = `http://${classInfo.portal}/3m/meeting/md5CheckMeeting.do?siteId=${classInfo.siteId}&meetingNumber=${classInfo.classId}&userId=${classInfo.userId}&userName=${classInfo.userName}&userType=${classInfo.userType}&passwordRequired=${classInfo.passwordRequired}&md5=${classInfo.md5}`;

  //----3.验证完成后获取------
  //getClassDetail 获取会议详情                let url = `http://${classInfo.portal}/3m/meeting/getClassH5.do?classNumber=${classInfo.classId}`;
  //getMeetingParam 获取会议最全参数集合      let url = `http://${classInfo.portal}/3m/api/meeting/detail.do?meetingNumber=${classInfo.classId}&timestamp=${timestamp}&authId=${authId}`;


  //Sass获取课堂校验信息
  getJoinParams(_initInfo) {
    loger.log('Sass获取课堂校验信息', _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	媒体服务器类型
    */
    let url = `http://${_initInfo.portal}/3m/api/meeting/joinParams.do?meetingNumber=${_initInfo.classId}&userID=${_initInfo.userId}`;
    loger.log('Sass获取课堂校验信息.', url);
    fetch(url, {
      timeout: 5000
    })
        .then(ret => {
          if (ret.ok) {
            return ret.json();
          } else {
            loger.error(`Sass获取课堂校验信息-网络异常.状态码:${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('Sass获取课堂校验信息完成');
            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(`Sass获取课堂校验信息异常.状态码:${err}`);
          this._emit(MessageTypes.MCU_ERROR,MessageTypes.ERR_CLASS_INIT_PROTOCOL,err);
        });
  }

  // Sass校验开始
  passwordAndMd5Checking(_param) {
    loger.log('发起Sass校验', _param);
    confInfo = _param;
    // 密码校验
    if (confInfo.passwordRequired === 'true'||confInfo.passwordRequired === true) {
      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=="host"){
      isTeacher=1
    }

    let url = `http://${confInfo.portal}/3m/api/meeting/signIn.do?siteId=${confInfo.siteId}&classId=${confInfo.classId}&isTeacher=${isTeacher}&password=${confInfo.password}`;
    loger.log('会议密码校验', 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);
      });
  }

  // 发起入会
  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}`;
    loger.log('H5SassMD5校验', url);
    fetch(url, {
        timeout: 5000
      })
      .then(ret => {
        if (ret.status === 200) {
          return ret.json();
        } else {
          loger.error(`H5SassMD5校验-网络异常.状态码:${ret.status}`);
          this._emit(MessageTypes.MCU_ERROR,MessageTypes.ERR_CLASS_JOIN_NETWORK);
          throw '';
        }
      })
      .then(ret => {
        if (ret.flag == "true") {
          if (ret.h5_mcu_list) {
            let server = ret.h5_mcu_list.split(";")[0];
            confInfo.MCUServerIP = server.split(":")[0];
            confInfo.MCUServerPort = server.split(":")[1];

            GlobalConfig.MCUServerIP=confInfo.MCUServerIP;
            GlobalConfig.MCUServerPort=confInfo.MCUServerPort;
          }
          confInfo.maxVideoChannels = ret.maxVideoChannels;
          confInfo.maxAudioChannels = ret.maxAudioChannels;
          confInfo.maxMediaChannels = confInfo.maxVideoChannels + confInfo.maxAudioChannels;

          GlobalConfig.maxVideoChannels=confInfo.maxVideoChannels;
          GlobalConfig.maxAudioChannels=confInfo.maxAudioChannels;
          GlobalConfig.maxMediaChannels=confInfo.maxMediaChannels;
          loger.log('H5Sass校验完成',ret);
          this._emit(Sass.SUCCESS,ret);
        } else {
          loger.log('H5SassMD5校验-失败.');
          this._emit(MessageTypes.MCU_ERROR,MessageTypes.ERR_CLASS_MD5_WRONG);

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

  // 获取会议详情
  getClassDetail() {
    let url = `http://${confInfo.portal}/3m/meeting/getClassH5.do?classNumber=${confInfo.classId}`;
    loger.log('Sass获取Class详情.', url);
    fetch(url, {
        timeout: 5000
      })
      .then(ret => {
        if (ret.ok) {
          return ret.json();
        } else {
          loger.error(`Sass获取Class详情-网络异常.状态码:${ret.status}`);
          this._emit(MessageTypes.MCU_ERROR,MessageTypes.ERR_GET_CLASS_DETAIL);
          throw '';
        }
      })
      .then(ret => {
        if (ret.errorCode === 0) {
          loger.log('Sass获取Class详情完成');
          this._emit(Sass.CLASS_GET_CLASS_DETAIL, ret);
        } else {
          loger.warn('Sass获取Class详情失败.');
          this._emit(MessageTypes.MCU_ERROR,MessageTypes.ERR_GET_CLASS_DETAIL);
        }
      })
      .catch(err => {
        loger.error(`H5Sass获取Class详情异常.状态码:${err}`);
        this._emit(MessageTypes.MCU_ERROR,MessageTypes.ERR_GET_CLASS_DETAIL);
      });
  }

  getMeetingParam(){
  /*
    参数 (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
  */
    var timestamp=new Date().getTime();
    var authId=MD5(confInfo.classId+""+timestamp);//课堂号+时间戳 的字符串,转成MD5
    let url = `http://${confInfo.portal}/3m/api/meeting/detail.do?meetingNumber=${confInfo.classId}&timestamp=${timestamp}&authId=${authId}`;
    loger.log('H5Sass获取getMeetingParam ', url);
    fetch(url, {
      timeout: 5000
    })
        .then(ret => {
          if (ret.ok) {
            return ret.json();
          } else {
            loger.error(`H5Sass获取getMeetingParam-网络异常.状态码:${ret.status}`);
            this._emit(MessageTypes.MCU_ERROR,MessageTypes.ERR_GET_MEETING_PARAML);

            throw '';
          }
        })
        .then(ret => {
          if (ret.code === 0) {
            loger.log('Sass获取getMeetingParam完成');
            this._emit(Sass.CLASS_GET_MEETING_PARAM, ret);
          } else {
            loger.warn('H5Sass获取getMeetingParam失败.');
            this._emit(MessageTypes.MCU_ERROR,MessageTypes.ERR_GET_MEETING_PARAML);
          }
        })
        .catch(err => {
          loger.error(`H5Sass获取getMeetingParam异常.状态码:${err}`);
          this._emit(MessageTypes.MCU_ERROR,MessageTypes.ERR_GET_MEETING_PARAML);
        });
  }
}

Sass.prototype.SUCCESS = Sass.SUCCESS = 'h5sass.success';
Sass.prototype.CLASS_INIT_SUCCESS = Sass.CLASS_INIT_SUCCESS = 'sass.class.init.success';
Sass.prototype.CLASS_GET_MEETING_PARAM= Sass.CLASS_GET_MEETING_PARAM  = 'class_getMeetingParam.message';
Sass.prototype.CLASS_GET_CLASS_DETAIL= Sass.CLASS_GET_CLASS_DETAIL  = 'class_getClassDetail.message';
export default new Sass;