/**
 * @class mw.Api.plugin.titleblacklist
 */
( function () {

	Object.assign( mw.Api.prototype, {
		/**
		 * Convenience method for `action=titleblacklist`.
		 *
		 * @param {mw.Title|string} title
		 * @param {Function} [ok] Success callback (deprecated)
		 * @param {Function} [err] Error callback (deprecated)
		 * @return {jQuery.Promise}
		 * @return {Function} return.done
		 * @return {Object|boolean} return.done.result False if title wasn't blacklisted, an object
		 *  with 'reason', 'line'
		 *  and 'message' properties if title was blacklisted.
		 */
		isBlacklisted: function ( title, ok, err ) {
			var d = $.Deferred();
			// Backwards compatibility (< MW 1.20)
			d.done( ok );
			d.fail( err );

			this.get( {
				action: 'titleblacklist',
				tbaction: 'create',
				tbtitle: title.toString(),
				errorformat: 'html',
				errorlang: mw.config.get( 'wgUserLanguage' ),
				errorsuselocal: '',
				formatversion: 2
			} )
				.done( function ( data ) {
					var result;

					// this fails open (if nothing valid is returned by the api, allows the title)
					// also fails open when the API is not present, which will be most of the time
					// as this API module is part of the TitleBlacklist extension.
					if ( data.titleblacklist && data.titleblacklist.result && data.titleblacklist.result === 'blacklisted' ) {
						if ( data.titleblacklist.reason ) {
							result = {
								reason: data.titleblacklist.reason,
								line: data.titleblacklist.line,
								message: data.titleblacklist.message
							};
						} else {
							mw.log( 'mw.Api.titleblacklist::isBlacklisted> no reason data for blacklisted title', 'debug' );
							result = {
								reason: 'Blacklisted, but no reason supplied',
								line: 'Unknown',
								message: null
							};
						}
						d.resolve( result );
					} else {
						d.resolve( false );
					}
				} )
				.fail( d.reject );

			return d.promise();
		}

	} );

	/**
	 * @class mw.Api
	 * @mixes mw.Api.plugin.titleblacklist
	 */

}() );
