( function ( mw ) {
	/**
	 * A widget representing a single toggle filter
	 *
	 * @extends OO.ui.CheckboxInputWidget
	 *
	 * @constructor
	 * @param {Object} config Configuration object
	 */
	mw.rcfilters.ui.CheckboxInputWidget = function MwRcfiltersUiCheckboxInputWidget( config ) {
		config = config || {};

		// Parent
		mw.rcfilters.ui.CheckboxInputWidget.parent.call( this, config );

		// Event
		this.$input
			// HACK: This widget just pretends to be a checkbox for visual purposes.
			// In reality, all actions - setting to true or false, etc - are
			// decided by the model, and executed by the controller. This means
			// that we want to let the controller and model make the decision
			// of whether to check/uncheck this checkboxInputWidget, and for that,
			// we have to bypass the browser action that checks/unchecks it during
			// click.
			.on( 'click', false )
			.on( 'change', this.onUserChange.bind( this ) );
	};

	/* Initialization */

	OO.inheritClass( mw.rcfilters.ui.CheckboxInputWidget, OO.ui.CheckboxInputWidget );

	/* Events */

	/**
	 * @event userChange
	 * @param {boolean} Current state of the checkbox
	 *
	 * The user has checked or unchecked this checkbox
	 */

	/* Methods */

	/**
	 * @inheritdoc
	 */
	mw.rcfilters.ui.CheckboxInputWidget.prototype.onEdit = function () {
		// Similarly to preventing defaults in 'click' event, we want
		// to prevent this widget from deciding anything about its own
		// state; it emits a change event and the model and controller
		// make a decision about what its select state is.
		// onEdit has a widget.$input.prop( 'checked' ) inside a setTimeout()
		// so we really want to prevent that from messing with what
		// the model decides the state of the widget is.
	};

	/**
	 * Respond to checkbox change by a user and emit 'userChange'.
	 */
	mw.rcfilters.ui.CheckboxInputWidget.prototype.onUserChange = function () {
		this.emit( 'userChange', this.$input.prop( 'checked' ) );
	};
}( mediaWiki ) );
