/*!
 * VisualEditor UserInterface SidebarDialogWindowManager class.
 *
 * @copyright See AUTHORS.txt
 */

/**
 * Window manager for sidebar dialogs.
 *
 * @class
 * @extends ve.ui.SurfaceWindowManager
 *
 * @constructor
 * @param {ve.ui.Surface} surface Surface this belongs to
 * @param {Object} [config] Configuration options
 * @param {ve.ui.Overlay} [config.overlay] Overlay to use for menus
 */
ve.ui.SidebarDialogWindowManager = function VeUiSidebarDialogWindowManager( surface, config = {} ) {
	// Parent constructor
	ve.ui.SidebarDialogWindowManager.super.call( this, surface, ve.extendObject( {
		modal: false,
		forceTrapFocus: true
	}, config ) );

	this.$element.addClass( 've-ui-sidebarDialogWindowManager' );

	this.connect( this, {
		opening: 'onSidebarDialogsOpeningOrClosing',
		closing: 'onSidebarDialogsOpeningOrClosing'
	} );
};

/* Inheritance */

OO.inheritClass( ve.ui.SidebarDialogWindowManager, ve.ui.SurfaceWindowManager );

/* Static Properties */

ve.ui.SidebarDialogWindowManager.static.sizes = {
	gutter: {
		width: 44,
		height: '100%'
	},
	small: {
		width: 150,
		height: '100%'
	},
	medium: {
		width: 300,
		height: '100%'
	},
	large: {
		width: 400,
		height: '100%'
	}
};

/* Methods */

/**
 * Handle windows opening or closing.
 *
 * @param {OO.ui.Window} win
 * @param {jQuery.Promise} openingOrClosing
 * @param {Object} data
 */
ve.ui.SidebarDialogWindowManager.prototype.onSidebarDialogsOpeningOrClosing = function ( win, openingOrClosing ) {
	const transitionDuration = OO.ui.theme.getDialogTransitionDuration();

	// win.isOpened before promise means we are closing
	const isClosing = win.isOpened();
	if ( isClosing ) {
		win.$element.css( 'width', '' );
	}
	// The following classes are generated here:
	// * ve-ui-surface-sidebarOpen-gutter
	// * ve-ui-surface-sidebarOpen-small
	// * ve-ui-surface-sidebarOpen-medium
	// * ve-ui-surface-sidebarOpen-large
	this.getSurface().$element.toggleClass( 've-ui-surface-sidebarOpen ve-ui-surface-sidebarOpen-' + win.getSize(), !isClosing );

	openingOrClosing.then( () => {
		// win.isOpened after promise means we are opening
		if ( win.isOpened() ) {
			win.$element.css( 'width', win.getSizeProperties().width );
		}

		setTimeout( () => {
			this.getSurface().getView().emit( 'position' );
		}, transitionDuration );
	} );
};

/**
 * @inheritdoc
 */
ve.ui.SidebarDialogWindowManager.prototype.getTeardownDelay = function () {
	return 250;
};