/**
 * Edit check to detect maintenance templates
 *
 * @class
 * @extends mw.editcheck.BaseEditCheck
 *
 * @constructor
 * @param {mw.editcheck.Controller} controller
 * @param {Object} [config]
 * @param {boolean} [includeSuggestions=false]
 */
mw.editcheck.MaintenanceTemplateEditCheck = function MWMaintenanceTemplateEditCheck() {
	// Parent constructor
	mw.editcheck.MaintenanceTemplateEditCheck.super.apply( this, arguments );
};

/* Inheritance */

OO.inheritClass( mw.editcheck.MaintenanceTemplateEditCheck, mw.editcheck.BaseEditCheck );

/* Static properties */

mw.editcheck.MaintenanceTemplateEditCheck.static.defaultConfig = ve.extendObject( {}, mw.editcheck.BaseEditCheck.static.defaultConfig, {
	showAsCheck: false,
	showAsSuggestion: false,
	templates: {}
} );

mw.editcheck.MaintenanceTemplateEditCheck.static.title = 'Maintenance template';

mw.editcheck.MaintenanceTemplateEditCheck.static.description = 'Act on this maintenace template?';

mw.editcheck.MaintenanceTemplateEditCheck.static.name = 'maintenanceTemplate';

mw.editcheck.MaintenanceTemplateEditCheck.static.choices = [
	{
		action: 'delete',
		label: OO.ui.deferMsg( 'visualeditor-contextitemwidget-label-remove' )
	},
	{
		action: 'dismiss',
		label: OO.ui.deferMsg( 'ooui-dialog-process-dismiss' )
	}
];

/* Methods */

/**
 * @inheritdoc
 */
mw.editcheck.MaintenanceTemplateEditCheck.prototype.canBeShown = function ( ...args ) {
	if ( !this.config.templates || Object.keys( this.config.templates ).length === 0 ) {
		// Abandon early here if this is unconfigured, to avoid doing the work
		// of fetching templates in the listener.
		return false;
	}

	return mw.editcheck.ToneCheck.super.prototype.canBeShown.call( this, ...args );
};

mw.editcheck.MaintenanceTemplateEditCheck.prototype.onDocumentChange = function ( surfaceModel ) {
	const documentModel = surfaceModel.getDocument();
	return this.getAddedNodes( documentModel, ve.dm.MWTransclusionNode ).map( ( node ) => {
		const range = node.getOuterRange();
		if ( this.isDismissedRange( range ) ) {
			return null;
		}
		return node.getPartsList().map( ( part ) => {
			if ( part.templatePage ) {
				// part.template varies depending on how it was specified, so normalize via mw.Title
				const title = mw.Title.newFromText( part.templatePage );
				const config = title && this.config.templates[ title.getMainText() ];
				if ( config ) {
					const msgkey = `editcheck-maintenancetemplate-${ title.getMainText() }-description`;
					ve.init.platform.addMessages( { [ msgkey ]: config.message } );
					return new mw.editcheck.EditCheckAction( {
						title: config.title,
						message: ve.deferJQueryMsg( msgkey ),
						fragments: [ surfaceModel.getLinearFragment( range ) ],
						check: this
					} );
				}
			}
			return null;
		} );
	} );
};

mw.editcheck.MaintenanceTemplateEditCheck.prototype.act = function ( choice, action, surface ) {
	if ( choice === 'delete' ) {
		action.fragments[ 0 ].removeContent();
		action.select( surface, true );
		action.complete();
		return;
	}

	// Parent method
	return mw.editcheck.MaintenanceTemplateEditCheck.super.prototype.act.apply( this, arguments );
};

/* Registration */

mw.editcheck.editCheckFactory.register( mw.editcheck.MaintenanceTemplateEditCheck );