import ByteBuffer from 'bytebuffer';

/**
 * Converts any object to a valid ts protobuf object.
 *
 * This is needed because there's a very jarring difference between `protobufjs` and `protobufts`.
 * `protobufjs` returns all `bytes` as `ByteBuffer` where as `protobufts` returns all `bytes` as `Uint8Array`.
 */
export function convertToTS(object: any): any {
  // No idea why js `ByteBuffer` and ts `ByteBuffer` differ ...
  if (object instanceof Uint8Array) {
    return object;
  } else if (object && object.constructor && object.constructor.name === 'ByteBuffer') {
    return new Uint8Array(object.toArrayBuffer());
  } else if (
    object instanceof ByteBuffer ||
    object instanceof Buffer ||
    object instanceof ArrayBuffer ||
    object instanceof SharedArrayBuffer
  ) {
    const arrayBuffer = ByteBuffer.wrap(object).toArrayBuffer();
    return new Uint8Array(arrayBuffer);
  } else if (Array.isArray(object)) {
    return object.map(convertToTS);
  } else if (object && typeof object === 'object') {
    const keys = Object.keys(object);
    const values: { [key: string]: any } = {};
    for (const key of keys) {
      values[key] = convertToTS(object[key]);
    }
    return values;
  }

  return object;
}
