/*******************************************************************************
 * Copyright (c) 2006, 2013 IBM Corporation and others.
 *
 * This program and the accompanying materials
 * are made available under the terms of the Eclipse Public License 2.0
 * which accompanies this distribution, and is available at
 * https://www.eclipse.org/legal/epl-2.0/
 *
 * SPDX-License-Identifier: EPL-2.0
 *
 * Contributors:
 *     IBM Corporation - initial API and implementation
 *******************************************************************************/
package org.eclipse.debug.internal.ui.commands.actions;

import org.eclipse.core.runtime.IStatus;
import org.eclipse.debug.core.DebugPlugin;
import org.eclipse.debug.core.ILaunch;
import org.eclipse.debug.core.IRequest;
import org.eclipse.debug.core.commands.ITerminateHandler;
import org.eclipse.debug.internal.core.commands.Request;
import org.eclipse.debug.internal.ui.DebugPluginImages;
import org.eclipse.debug.internal.ui.DebugUIPlugin;
import org.eclipse.debug.internal.ui.IInternalDebugUIConstants;
import org.eclipse.debug.internal.ui.actions.ActionMessages;
import org.eclipse.debug.internal.ui.views.DebugUIViewsMessages;
import org.eclipse.debug.ui.actions.DebugCommandAction;
import org.eclipse.debug.ui.contexts.DebugContextEvent;
import org.eclipse.jface.dialogs.MessageDialog;
import org.eclipse.jface.resource.ImageDescriptor;
import org.eclipse.jface.viewers.ISelection;
import org.eclipse.jface.viewers.IStructuredSelection;
import org.eclipse.swt.widgets.Event;
import org.eclipse.ui.IWorkbenchPart;
import org.eclipse.ui.IWorkbenchWindow;
import org.eclipse.ui.PlatformUI;

/**
 * Terminate and remove action.
 *
 * @since 3.3
 */
public class TerminateAndRemoveAction extends DebugCommandAction {

	/**
	 * Whether the target can be terminated. The action is always enabled,
	 * but does not always need to terminate the target first.
	 */
	private boolean fCanTerminate = false;

	/**
	 * Local copy of part, possibly null
	 */
	private IWorkbenchPart fMyPart = null;

    @Override
	public String getText() {
        return ActionMessages.TerminateAndRemoveAction_0;
    }

    @Override
	public String getHelpContextId() {
        return "org.eclipse.debug.ui.terminate_and_remove_action_context"; //$NON-NLS-1$
    }

    @Override
	public String getId() {
        return "org.eclipse.debug.ui.debugview.popupMenu.terminateAndRemove"; //$NON-NLS-1$
    }

    @Override
	public String getToolTipText() {
        return ActionMessages.TerminateAndRemoveAction_3;
    }

    @Override
	public ImageDescriptor getDisabledImageDescriptor() {
        return DebugPluginImages.getImageDescriptor(IInternalDebugUIConstants.IMG_DLCL_TERMINATE_AND_REMOVE);
    }

    @Override
	public ImageDescriptor getHoverImageDescriptor() {
        return DebugPluginImages.getImageDescriptor(IInternalDebugUIConstants.IMG_ELCL_TERMINATE_AND_REMOVE);
    }

    @Override
	public ImageDescriptor getImageDescriptor() {
        return DebugPluginImages.getImageDescriptor(IInternalDebugUIConstants.IMG_ELCL_TERMINATE_AND_REMOVE);
    }

    @Override
	protected Class<ITerminateHandler> getCommandType() {
		return ITerminateHandler.class;
	}

    @Override
	public void debugContextChanged(DebugContextEvent event) {
        boolean isAllTerminated = true;
        ISelection context = event.getContext();
        if (context instanceof IStructuredSelection) {
            Object[] elements = ((IStructuredSelection)context).toArray();
            for (int i = 0; i < elements.length; i++) {
                if (!isTerminated(elements[i])) {
                    isAllTerminated = false;
                    break;
                }
            }
        }
        // IF all elements are terminated, we don't need to query the terminate handler, just
        // enable the action, which whill just remove the terminated launches (bug 324959).
        fCanTerminate = !isAllTerminated;
        if (isAllTerminated) {
            setEnabled(true);
        } else {
            super.debugContextChanged(event);
        }
    }

    protected boolean isTerminated(Object element) {
        ILaunch launch = DebugUIPlugin.getLaunch(element);
        if (launch != null) {
            return launch.isTerminated();
        }
        return false;
    }


    @Override
	protected void postExecute(IRequest request, Object[] targets) {
        IStatus status = request.getStatus();
        if(status == null || status.isOK()) {
            for (int i = 0; i < targets.length; i++) {
                ILaunch launch = DebugUIPlugin.getLaunch(targets[i]);
                if (launch != null) {
					DebugPlugin.getDefault().getLaunchManager().removeLaunch(launch);
				}
            }
        }
    }

    @Override
	public void runWithEvent(Event event) {
    	if (fCanTerminate) {
			IWorkbenchWindow window = PlatformUI.getWorkbench().getActiveWorkbenchWindow();
	    	if (window != null) {
		    	if (!MessageDialog.openQuestion(window.getShell(), DebugUIViewsMessages.LaunchView_Terminate_and_Remove_1, DebugUIViewsMessages.LaunchView_Terminate_and_remove_selected__2)) {
					return;
				}
	    	}
	    	super.runWithEvent(event);
    	} else {
    		// don't terminate, just remove
    		// TODO: make #getContext() API in next release
    		ISelection sel = null;
    		if (fMyPart != null) {
    			sel = getDebugContextService().getActiveContext(fMyPart.getSite().getId());
    	    } else {
    	    	sel = getDebugContextService().getActiveContext();
    	    }
    		if (sel instanceof IStructuredSelection) {
                IStructuredSelection ss = (IStructuredSelection) sel;
                postExecute(new Request(), ss.toArray());
            }
    	}
    }

    @Override
	public void init(IWorkbenchPart part) {
    	super.init(part); // TODO: if #getContext() was API, this would not be needed
    	fMyPart = part;
    }
}
