/*!
 * VisualEditor DataModel MWTable class.
 *
 * @copyright See AUTHORS.txt
 * @license The MIT License (MIT); see LICENSE.txt
 */

/**
 * DataModel MediaWiki table node.
 *
 * @class
 * @extends ve.dm.TableNode
 * @mixes ve.dm.ClassAttributeNode
 *
 * @constructor
 * @param {Object} [element] Reference to element in linear model
 * @param {ve.dm.Node[]} [children]
 */
ve.dm.MWTableNode = function VeDmMWTableNode() {
	// Parent constructor
	ve.dm.MWTableNode.super.apply( this, arguments );

	// Mixin constructors
	ve.dm.ClassAttributeNode.call( this );
};

/* Inheritance */

OO.inheritClass( ve.dm.MWTableNode, ve.dm.TableNode );

OO.mixinClass( ve.dm.MWTableNode, ve.dm.ClassAttributeNode );

/* Static Properties */

ve.dm.MWTableNode.static.name = 'mwTable';

ve.dm.MWTableNode.static.allowedRdfaTypes = [ 'mw:ExpandedAttrs' ];

ve.dm.MWTableNode.static.classAttributes = {
	wikitable: { wikitable: true },
	sortable: { sortable: true },
	'mw-collapsible': { collapsible: true },
	'mw-collapsed': { collapsed: true }
};

// Tables in wikitext only work in some contexts, they're impossible e.g. in list items
ve.dm.MWTableNode.static.suggestedParentNodeTypes = [
	'document', 'div', 'tableCell', 'tableCaption', 'mwImageCaption', 'section',
	// TODO: `paragraph` isn't really a suggested table parent. However,
	// allowing it here interacts with our post-insertion cleanup for block
	// nodes so that empty paragraphs get properly removed. We should find a
	// cleaner way to do this. See: T201573.
	'paragraph'
];

// HACK: users of parentNodeTypes should be fixed to check for inherited classes.
ve.dm.TableSectionNode.static.parentNodeTypes.push( 'mwTable' );
ve.dm.TableCaptionNode.static.parentNodeTypes.push( 'mwTable' );
ve.dm.TableRowNode.static.childNodeTypes.push( 'mwTransclusionTableCell' );

ve.dm.MWTableNode.static.toDataElement = function ( domElements ) {
	const dataElement = { type: this.name },
		domElement = domElements[ 0 ],
		classAttr = domElement.getAttribute( 'class' );

	const attributes = {
		hasExpandedAttrs: ( domElement.getAttribute( 'typeof' ) || '' ).indexOf( 'mw:ExpandedAttrs' ) !== -1
	};

	this.setClassAttributes( attributes, classAttr );

	dataElement.attributes = attributes;

	return dataElement;
};

ve.dm.MWTableNode.static.toDomElements = function ( dataElement, doc ) {
	const element = doc.createElement( 'table' ),
		classAttr = dataElement.attributes && this.getClassAttrFromAttributes( dataElement.attributes );

	if ( classAttr ) {
		// eslint-disable-next-line mediawiki/class-doc
		element.className = classAttr;
	}

	return [ element ];
};

ve.dm.MWTableNode.static.sanitize = function ( dataElement ) {
	// Mixin method
	ve.dm.ClassAttributeNode.static.sanitize.call( this, dataElement );

	ve.setProp( dataElement, 'attributes', 'wikitable', true );
};

/* Registration */

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