'use strict';

Object.defineProperty(exports, "__esModule", {
    value: true
});
exports["default"] = customHTML2Content;

var _draftJs = require('draft-js');

var _toArray = require('lodash/toArray');

var _toArray2 = _interopRequireDefault(_toArray);

var _immutable = require('immutable');

function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { "default": obj }; }

function compose() {
    for (var _len = arguments.length, argument = Array(_len), _key = 0; _key < _len; _key++) {
        argument[_key] = arguments[_key];
    }

    var args = arguments;
    var start = args.length - 1;
    return function () {
        var i = start;
        var result = args[start].apply(this, arguments);
        while (i--) {
            result = args[i].call(this, result);
        }return result;
    };
}
;
/*
 * Helpers
 */
// Prepares img meta data object based on img attributes
var getBlockSpecForElement = function getBlockSpecForElement(imgElement) {
    return {
        contentType: 'image',
        src: imgElement.getAttribute('src'),
        width: imgElement.getAttribute('width'),
        height: imgElement.getAttribute('height'),
        align: imgElement.style.cssFloat
    };
};
// Wraps meta data in HTML element which is 'understandable' by Draft, I used <blockquote />.
var wrapBlockSpec = function wrapBlockSpec(blockSpec) {
    if (blockSpec == null) {
        return null;
    }
    var tempEl = document.createElement('blockquote');
    // stringify meta data and insert it as text content of temp HTML element. We will later extract
    // and parse it.
    tempEl.innerText = JSON.stringify(blockSpec);
    return tempEl;
};
// Replaces <img> element with our temp element
var replaceElement = function replaceElement(oldEl, newEl) {
    if (!(newEl instanceof HTMLElement)) {
        return;
    }
    var parentNode = oldEl.parentNode;
    return parentNode.replaceChild(newEl, oldEl);
};
var elementToBlockSpecElement = compose(wrapBlockSpec, getBlockSpecForElement);
var imgReplacer = function imgReplacer(imgElement) {
    return replaceElement(imgElement, elementToBlockSpecElement(imgElement));
};
// creates ContentBlock based on provided spec
var createContentBlock = function createContentBlock(blockData, contentState) {
    var key = blockData.key,
        type = blockData.type,
        text = blockData.text,
        data = blockData.data,
        inlineStyles = blockData.inlineStyles,
        entityData = blockData.entityData;

    var blockSpec = {
        type: type != null ? type : 'unstyled',
        text: text != null ? text : '',
        key: key != null ? key : (0, _draftJs.genKey)(),
        data: null,
        characterList: (0, _immutable.List)([])
    };
    if (data) {
        blockSpec.data = (0, _immutable.fromJS)(data);
    }
    if (inlineStyles || entityData) {
        var entityKey = void 0;
        if (entityData) {
            var _type = entityData.type,
                mutability = entityData.mutability,
                _data = entityData.data;

            contentState.createEntity(_type, mutability, _data);
            entityKey = contentState.getLastCreatedEntityKey();
        } else {
            entityKey = null;
        }
        var style = (0, _immutable.OrderedSet)(inlineStyles || []);
        var charData = _draftJs.CharacterMetadata.create({ style: style, entityKey: entityKey });
        blockSpec.characterList = (0, _immutable.List)((0, _immutable.Repeat)(charData, text.length));
    }
    return new _draftJs.ContentBlock(blockSpec);
};
// takes HTML string and returns DraftJS ContentState
function customHTML2Content(HTML, contentState) {
    var tempDoc = new DOMParser().parseFromString(HTML, 'text/html');
    // replace all <img /> with <blockquote /> elements
    (0, _toArray2["default"])(tempDoc.querySelectorAll('img')).forEach(imgReplacer);
    // use DraftJS converter to do initial conversion. I don't provide DOMBuilder and
    // blockRenderMap arguments here since it should fall back to its default ones, which are fine

    var _convertFromHTML = (0, _draftJs.convertFromHTML)(tempDoc.body.innerHTML),
        contentBlocks = _convertFromHTML.contentBlocks;
    // now replace <blockquote /> ContentBlocks with 'atomic' ones


    contentBlocks = contentBlocks.reduce(function (contentBlocks, block) {
        if (block.getType() !== 'blockquote') {
            return contentBlocks.concat(block);
        }
        var image = JSON.parse(block.getText());
        contentState.createEntity('IMAGE-ENTITY', 'IMMUTABLE', image);
        var entityKey = contentState.getLastCreatedEntityKey();
        var charData = _draftJs.CharacterMetadata.create({ entity: entityKey });
        // const blockSpec = Object.assign({ type: 'atomic', text: ' ' }, { entityData })
        // const atomicBlock = createContentBlock(blockSpec)
        // const spacerBlock = createContentBlock({});
        var fragmentArray = [new _draftJs.ContentBlock({
            key: (0, _draftJs.genKey)(),
            type: 'image-block',
            text: ' ',
            characterList: (0, _immutable.List)((0, _immutable.Repeat)(charData, charData.count()))
        }), new _draftJs.ContentBlock({
            key: (0, _draftJs.genKey)(),
            type: 'unstyled',
            text: '',
            characterList: (0, _immutable.List)()
        })];
        return contentBlocks.concat(fragmentArray);
    }, []);
    // console.log('>> customHTML2Content contentBlocks', contentBlocks);
    tempDoc = null;
    return _draftJs.BlockMapBuilder.createFromArray(contentBlocks);
}
module.exports = exports['default'];