/*!
 * VisualEditor DataModel CheckListItemNode class.
 *
 * @copyright See AUTHORS.txt
 */

/**
 * DataModel list item node.
 *
 * @class
 * @extends ve.dm.BranchNode
 *
 * @constructor
 * @param {Object} [element] Reference to element in linear model
 * @param {ve.dm.Node[]} [children]
 */
ve.dm.CheckListItemNode = function VeDmCheckListItemNode() {
	// Parent constructor
	ve.dm.CheckListItemNode.super.apply( this, arguments );
};

/* Inheritance */

OO.inheritClass( ve.dm.CheckListItemNode, ve.dm.BranchNode );

/* Static Properties */

ve.dm.CheckListItemNode.static.name = 'checkListItem';

ve.dm.CheckListItemNode.static.parentNodeTypes = [ 'checkList' ];

ve.dm.CheckListItemNode.static.matchTagNames = [ 'li' ];

ve.dm.CheckListItemNode.static.matchRdfaTypes = [ 've:checkList' ];

ve.dm.CheckListItemNode.static.handlesOwnChildren = true;

ve.dm.CheckListItemNode.static.toDataElement = function ( domElements, converter ) {
	const checked = domElements[ 0 ].hasAttribute( 'data-checked' ) ||
		// Old HTML format used the invalid attribute "checked"
		domElements[ 0 ].hasAttribute( 'checked' );
	const element = { type: this.name, attributes: { checked } };
	return converter.getDataFromDomClean( domElements[ 0 ], element );
};

ve.dm.CheckListItemNode.static.toDomElements = function ( data, doc, converter ) {
	const dataElement = data[ 0 ];
	const listItem = doc.createElement( 'li' );
	listItem.setAttribute( 'rel', 've:checkList' );
	if ( dataElement.attributes.checked ) {
		listItem.setAttribute( 'data-checked', 'checked' );
	}

	const contents = data.slice( 1, -1 );
	if ( contents.length ) {
		const wrapper = doc.createElement( 'div' );
		converter.getDomSubtreeFromData( contents, wrapper );
		while ( wrapper.firstChild ) {
			listItem.appendChild( wrapper.firstChild );
		}
	}

	// Formatting for external paste / preview
	// * Hide the bullet list
	// * Add a unicode checkbox to the text
	const checkboxText = document.createTextNode( dataElement.attributes.checked ? '☑' : '☐' );
	let checkbox;
	if ( converter.isForParser() ) {
		checkbox = checkboxText;
	} else {
		listItem.style.listStyle = 'none';
		checkbox = document.createElement( 'span' );
		checkbox.setAttribute( 'data-ve-ignore', '' );
		checkbox.appendChild( checkboxText );
	}

	// The first child should be the wrapper paragraph
	const textContainer = listItem.firstChild.nodeType === Node.TEXT_NODE ? listItem : listItem.firstChild;
	textContainer.insertBefore( document.createTextNode( ' ' ), textContainer.firstChild );
	textContainer.insertBefore( checkbox, textContainer.firstChild );

	return [ listItem ];
};

ve.dm.CheckListItemNode.static.resetAttributesForClone = function ( clonedElement ) {
	clonedElement.attributes.checked = false;
};

/* Registration */

ve.dm.modelRegistry.register( ve.dm.CheckListItemNode );
