text: 'use strict';
  
  const MongoError = require('../error').MongoError;
  const collectionNamespace = require('./shared').collectionNamespace;
  const command = require('./command');
  
  function writeCommand(server, type, opsField, ns, ops, options, callback) {
    if (ops.length === 0) throw new MongoError(`${type} must contain at least one document`);
    if (typeof options === 'function') {
      callback = options;
      options = {};
    }
  
    options = options || {};
    const ordered = typeof options.ordered === 'boolean' ? options.ordered : true;
    const writeConcern = options.writeConcern;
  
    const writeCommand = {};
    writeCommand[type] = collectionNamespace(ns);
    writeCommand[opsField] = ops;
    writeCommand.ordered = ordered;
  
    if (writeConcern && Object.keys(writeConcern).length > 0) {
      writeCommand.writeConcern = writeConcern;
    }
  
    if (options.collation) {
      for (let i = 0; i < writeCommand[opsField].length; i++) {
        if (!writeCommand[opsField][i].collation) {
          writeCommand[opsField][i].collation = options.collation;
        }
      }
    }
  
    if (options.bypassDocumentValidation === true) {
      writeCommand.bypassDocumentValidation = options.bypassDocumentValidation;
    }
  
    const commandOptions = Object.assign(
      {
        checkKeys: type === 'insert',
        numberToReturn: 1
      },
      options
    );
  
    command(server, ns, writeCommand, commandOptions, callback);
  }
  
  module.exports = writeCommand;
  