/*!
 * VisualEditor MobileActionsContextItem class.
 *
 * @copyright See AUTHORS.txt
 */

/**
 * Context item to show extra actions required on mobile.
 *
 * These actions allow users to do things that are not possible with
 * a virtual keyboard and a fake selection, specifically copy & delete.
 *
 * @class
 * @extends ve.ui.LinearContextItem
 *
 * @param {ve.ui.LinearContext} context Context the item is in
 * @param {ve.dm.Model} model Model the item is related to
 * @param {Object} [config] Configuration options
 */
ve.ui.MobileActionsContextItem = function VeUiMobileActionsContextItem( context, model, config ) {
	// Parent constructor
	ve.ui.MobileActionsContextItem.super.call( this, context, model, config );

	this.copyButton = new OO.ui.ButtonWidget( {
		framed: false,
		label: ve.msg( 'visualeditor-clipboard-copy' ),
		icon: 'copy'
	} );
	this.deleteButton = new OO.ui.ButtonWidget( {
		framed: false,
		label: ve.msg( 'visualeditor-contextitemwidget-label-remove' ),
		icon: 'trash',
		flags: [ 'destructive' ]
	} );

	this.$head.append( this.copyButton.$element );
	if ( !this.isReadOnly() ) {
		this.$head.append( this.deleteButton.$element );
	}

	// Events
	this.copyButton.connect( this, { click: 'onCopyButtonClick' } );
	this.deleteButton.connect( this, { click: 'onDeleteButtonClick' } );

	// Initialization
	this.$element.addClass( 've-ui-mobileActionsContextItem' );
};

/* Inheritance */

OO.inheritClass( ve.ui.MobileActionsContextItem, ve.ui.LinearContextItem );

/* Static Properties */

ve.ui.MobileActionsContextItem.static.name = 'mobileActions';

ve.ui.MobileActionsContextItem.static.editable = false;

// Show this context last
ve.ui.MobileActionsContextItem.static.sortOrder = 1;

/**
 * @inheritdoc
 */
ve.ui.MobileActionsContextItem.static.isCompatibleWith = function ( model ) {
	return OO.ui.isMobile() && model instanceof ve.dm.Node && (
		model.isFocusable() || model.isCellable()
	);
};

/* Methods */

/**
 * Handle copy button click events.
 */
ve.ui.MobileActionsContextItem.prototype.onCopyButtonClick = function () {
	const surfaceView = this.context.getSurface().getView();

	surfaceView.activate();
	// Force a native selection on mobile
	surfaceView.preparePasteTargetForCopy( true );

	let copied;
	try {
		copied = document.execCommand( 'copy' );
	} catch ( e ) {
		copied = false;
	}

	ve.init.platform.notify( ve.msg( copied ? 'visualeditor-clipboard-copy-success' : 'visualeditor-clipboard-copy-fail' ) );

	// Restore normal selection for device type
	surfaceView.preparePasteTargetForCopy();
	if ( OO.ui.isMobile() ) {
		// Support: Mobile Safari
		// Force remove the selection to hide the keyboard
		document.activeElement.blur();
	}

	ve.track( 'activity.' + this.constructor.static.name, { action: 'context-copy' } );
};

/**
 * Handle delete button click events.
 *
 * @fires ve.ui.ContextItem#command
 */
ve.ui.MobileActionsContextItem.prototype.onDeleteButtonClick = function () {
	const surface = this.context.getSurface();
	const command = surface.commandRegistry.lookup( 'backspace' );

	// Use the 'backspace' command as this triggers the KeyDownHandler for the
	// current selection, e.g. ve.ce.TableDeleteKeyDownHandler will be used to
	// clear table cells for TableSelection's.
	if ( command ) {
		command.execute( surface, undefined, 'context' );
		this.emit( 'command' );
		ve.track( 'activity.' + this.constructor.static.name, { action: 'context-delete' } );
	}
};

/* Registration */

ve.ui.contextItemFactory.register( ve.ui.MobileActionsContextItem );
