import ProtoBuf from 'protobufjs';
import pro from './pro';
import PduType from './PduType';
import PduConsts from './PduConsts';

let builder = ProtoBuf.newBuilder({ convertFieldsToCamelCase: true });
ProtoBuf.loadProto(pro, builder);

let pdu = builder.build();

// 底层通信层[Firstlayer] - RCSendDataPdu封包
function create_pdu(type, sub_type,
  initiator, conference_id, session_id,
  channel_id, upward, reliability, priority,
  peer, seg) {
  var pduMsg = new pdu['RCSendDataPdu']();
  pduMsg.set("type", type);
  pduMsg.set("subType", sub_type);
  pduMsg.set("initiator", initiator);
  pduMsg.set("confId", conference_id);//***confId mcu服务用的是这个字段,客户端在其他地方统一为classId
  pduMsg.set("sessionId", session_id);
  pduMsg.set("channelId", channel_id);
  pduMsg.set("upward", upward);
  pduMsg.set("reliability", reliability);
  pduMsg.set("priority", priority);
  pduMsg.set("peer", peer);
  pduMsg.set("seg", seg);
  return pduMsg;
}
// 底层通信层[Firstlayer] - RCSendDataPdu解包
pdu.decode_pdu = function (buffer) {
  return pdu['RCSendDataPdu'].decode(buffer);
};

pdu.create_join_class_request_pdu = function (
  sub_type,
  initiator,
  conference_id,
  session_id,
  channel_id,
  reliability,
  priority,
  peer,
  seg
) {
  return create_pdu(PduType.RCPDU_CONNECT_PROVIDER_REQUEST,
    sub_type, initiator, conference_id, session_id, channel_id, true,
    reliability, priority, peer, seg);
};

  //upward 是否向顶层抛  create_uniform_pdu默认为true
pdu.create_uniform_pdu = function (
  sub_type,
  initiator,
  conference_id,
  session_id,
  channel_id,
  reliability,
  priority,
  peer,
  seg
) {
  return create_pdu(PduType.RCPDU_UNIFORM_SEND_DATA_REQUEST,
    sub_type, initiator, conference_id, session_id, channel_id, true,
    reliability, priority, peer, seg);
};

//upward 是否向顶层抛  create_normal_pdu 中由外部定义
pdu.create_normal_pdu = function (
  sub_type,
  initiator,
  conference_id,
  session_id,
  channel_id,
  upward,
  reliability,
  priority,
  peer,
  seg
) {
  return create_pdu(PduType.RCPDU_SEND_DATA_REQUEST,
    sub_type, initiator, conference_id, session_id, channel_id, upward,
    reliability, priority, peer, seg);
};

pdu.id2type = function (id) {
  for (var type_const in PduType) {
    if (PduType[type_const] === id) {
      return type_const;
    }
  }
};

// 合并统一对外
pdu = {...pdu, ...PduType, ...PduConsts };

export default pdu;