/* global window, dcodeIO, textsecure */

// eslint-disable-next-line func-names
(function() {
  window.textsecure = window.textsecure || {};
  window.textsecure.protobuf = {};

  function loadProtoBufs(filename) {
    return dcodeIO.ProtoBuf.loadProtoFile(
      { root: window.PROTO_ROOT, file: filename },
      (error, result) => {
        if (error) {
          const text = `Error loading protos from ${filename} (root: ${
            window.PROTO_ROOT
          }) ${error && error.stack ? error.stack : error}`;
          window.log.error(text);
          throw error;
        }
        const protos = result.build('signalservice');
        if (!protos) {
          const text = `Error loading protos from ${filename} (root: ${
            window.PROTO_ROOT
          })`;
          window.log.error(text);
          throw new Error(text);
        }
        // eslint-disable-next-line no-restricted-syntax, guard-for-in
        for (const protoName in protos) {
          textsecure.protobuf[protoName] = protos[protoName];
        }
      }
    );
  }

  loadProtoBufs('SignalService.proto');
  loadProtoBufs('SubProtocol.proto');
  loadProtoBufs('DeviceMessages.proto');
  loadProtoBufs('WhisperTextProtocol.proto');

  // Just for encrypting device names
  loadProtoBufs('DeviceName.proto');

  // Metadata-specific protos
  loadProtoBufs('UnidentifiedDelivery.proto');
})();