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.confId}&userID=${_initInfo.userId}`;

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

  //----3.验证完成后获取------
  //getClassDetail 获取会议详情                let url = `http://${confInfo.portal}/3m/meeting/getClassH5.do?classNumber=${confInfo.confId}`;
  //getMeetingParam 获取会议最全参数集合      let url = `http://${confInfo.portal}/3m/api/meeting/detail.do?meetingNumber=${confInfo.confId}&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.confId}&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 => {
          if (ret.code === 0) {
            loger.log('Sass获取课堂校验信息完成');
            this._emit(Sass.CLASS_INIT_SUCCESS,ret);
          } else {
            loger.warn('Sass获取课堂校验信息失败.');
            this._emit(MessageTypes.MCU_ERROR,MessageTypes.ERR_CLASS_INIT_FAILED);
          }
        })
        .catch(err => {
          loger.error(`Sass获取课堂校验信息异常.状态码:${err}`);
          this._emit(MessageTypes.MCU_ERROR,MessageTypes.ERR_CLASS_INIT_PROTOCOL);
        });
  }

  // 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://${confInfo.portal}/3m/getCheckMeetinig.do?siteId=${confInfo.siteId}&classId=${confInfo.confId}&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 => {
        if (ret === 'false') {
          loger.error(`会议密码校验-失败.`);
          this._emit(MessageTypes.MCU_ERROR,MessageTypes.ERR_CLASS_PASSWORD_WRONG);
          return ;
        }
        if (ret === 'true') {
          loger.log(`会议密码校验-成功.`);
          this.sendMD5Checking();
          return;
        }
        loger.error(`会议密码校验-协议异常.`);
        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.confId}&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校验完成');
          console.log(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.confId}`;
    loger.log('H5Sass获取Class详情.', url);
    fetch(url, {
        timeout: 5000
      })
      .then(ret => {
        if (ret.ok) {
          return ret.json();
        } else {
          loger.error(`H5Sass获取Class详情-网络异常.状态码:${ret.status}`);
          this._emit(MessageTypes.MCU_ERROR,MessageTypes.ERR_GET_CLASS_DETAIL);
          throw '';
        }
      })
      .then(ret => {
        if (ret.errorCode === 0) {
          loger.log('H5Sass获取Class详情完成');
          this._emit(Sass.CLASS_GET_CLASS_DETAIL, ret);
        } else {
          loger.warn('H5Sass获取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	课堂号
  */
    var timestamp=new Date().getTime();
    var authId=MD5(confInfo.confId+""+timestamp);//课堂号+时间戳 的字符串,转成MD5
    let url = `http://${confInfo.portal}/3m/api/meeting/detail.do?meetingNumber=${confInfo.confId}&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('H5Sass获取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;