import { __require as requireContentBlock } from './ContentBlock.js';
import { __require as requireContentBlockNode } from './ContentBlockNode.js';
import { __require as requireDraftStringKey } from './DraftStringKey.js';
import { __require as requireEncodeEntityRanges } from './encodeEntityRanges.js';
import { __require as requireEncodeInlineStyleRanges } from './encodeInlineStyleRanges.js';
import { __require as requireInvariant } from '../../../../fbjs@2.0.0/node_modules/fbjs/lib/invariant.js';

/**
 * Copyright (c) Facebook, Inc. and its affiliates.
 *
 * This source code is licensed under the MIT license found in the
 * LICENSE file in the root directory of this source tree.
 *
 * @format
 * 
 * @emails oncall+draft_js
 */

var convertFromDraftStateToRaw_1;
var hasRequiredConvertFromDraftStateToRaw;

function requireConvertFromDraftStateToRaw () {
	if (hasRequiredConvertFromDraftStateToRaw) return convertFromDraftStateToRaw_1;
	hasRequiredConvertFromDraftStateToRaw = 1;

	function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i] != null ? arguments[i] : {}; var ownKeys = Object.keys(source); if (typeof Object.getOwnPropertySymbols === 'function') { ownKeys = ownKeys.concat(Object.getOwnPropertySymbols(source).filter(function (sym) { return Object.getOwnPropertyDescriptor(source, sym).enumerable; })); } ownKeys.forEach(function (key) { _defineProperty(target, key, source[key]); }); } return target; }

	function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }

	var ContentBlock = requireContentBlock();

	var ContentBlockNode = requireContentBlockNode();

	var DraftStringKey = requireDraftStringKey();

	var encodeEntityRanges = requireEncodeEntityRanges();

	var encodeInlineStyleRanges = requireEncodeInlineStyleRanges();

	var invariant = requireInvariant();

	var createRawBlock = function createRawBlock(block, entityStorageMap) {
	  return {
	    key: block.getKey(),
	    text: block.getText(),
	    type: block.getType(),
	    depth: block.getDepth(),
	    inlineStyleRanges: encodeInlineStyleRanges(block),
	    entityRanges: encodeEntityRanges(block, entityStorageMap),
	    data: block.getData().toObject()
	  };
	};

	var insertRawBlock = function insertRawBlock(block, entityMap, rawBlocks, blockCacheRef) {
	  if (block instanceof ContentBlock) {
	    rawBlocks.push(createRawBlock(block, entityMap));
	    return;
	  }

	  !(block instanceof ContentBlockNode) ? process.env.NODE_ENV !== "production" ? invariant(false, 'block is not a BlockNode') : invariant(false) : void 0;
	  var parentKey = block.getParentKey();

	  var rawBlock = blockCacheRef[block.getKey()] = _objectSpread({}, createRawBlock(block, entityMap), {
	    children: []
	  });

	  if (parentKey) {
	    blockCacheRef[parentKey].children.push(rawBlock);
	    return;
	  }

	  rawBlocks.push(rawBlock);
	};

	var encodeRawBlocks = function encodeRawBlocks(contentState, rawState) {
	  var entityMap = rawState.entityMap;
	  var rawBlocks = [];
	  var blockCacheRef = {};
	  var entityCacheRef = {};
	  var entityStorageKey = 0;
	  contentState.getBlockMap().forEach(function (block) {
	    block.findEntityRanges(function (character) {
	      return character.getEntity() !== null;
	    }, function (start) {
	      var entityKey = block.getEntityAt(start); // Stringify to maintain order of otherwise numeric keys.

	      var stringifiedEntityKey = DraftStringKey.stringify(entityKey); // This makes this function resilient to two entities
	      // erroneously having the same key

	      if (entityCacheRef[stringifiedEntityKey]) {
	        return;
	      }

	      entityCacheRef[stringifiedEntityKey] = entityKey; // we need the `any` casting here since this is a temporary state
	      // where we will later on flip the entity map and populate it with
	      // real entity, at this stage we just need to map back the entity
	      // key used by the BlockNode

	      entityMap[stringifiedEntityKey] = "".concat(entityStorageKey);
	      entityStorageKey++;
	    });
	    insertRawBlock(block, entityMap, rawBlocks, blockCacheRef);
	  });
	  return {
	    blocks: rawBlocks,
	    entityMap: entityMap
	  };
	}; // Flip storage map so that our storage keys map to global
	// DraftEntity keys.


	var encodeRawEntityMap = function encodeRawEntityMap(contentState, rawState) {
	  var blocks = rawState.blocks,
	      entityMap = rawState.entityMap;
	  var rawEntityMap = {};
	  Object.keys(entityMap).forEach(function (key, index) {
	    var entity = contentState.getEntity(DraftStringKey.unstringify(key));
	    rawEntityMap[index] = {
	      type: entity.getType(),
	      mutability: entity.getMutability(),
	      data: entity.getData()
	    };
	  });
	  return {
	    blocks: blocks,
	    entityMap: rawEntityMap
	  };
	};

	var convertFromDraftStateToRaw = function convertFromDraftStateToRaw(contentState) {
	  var rawDraftContentState = {
	    entityMap: {},
	    blocks: []
	  }; // add blocks

	  rawDraftContentState = encodeRawBlocks(contentState, rawDraftContentState); // add entities

	  rawDraftContentState = encodeRawEntityMap(contentState, rawDraftContentState);
	  return rawDraftContentState;
	};

	convertFromDraftStateToRaw_1 = convertFromDraftStateToRaw;
	return convertFromDraftStateToRaw_1;
}

export { requireConvertFromDraftStateToRaw as __require };
//# sourceMappingURL=convertFromDraftStateToRaw.js.map
