/*******************************************************************************
 * Copyright (c) 2004, 2009 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
 *     Brock Janiczak <brockj@tpg.com.au> - Bug 166333 [Wizards] Show diff in CVS commit dialog
 *******************************************************************************/
package org.eclipse.team.internal.ccvs.ui.wizards;

import org.eclipse.core.resources.IFile;
import org.eclipse.core.resources.IResource;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.jface.action.*;
import org.eclipse.jface.dialogs.IDialogSettings;
import org.eclipse.jface.viewers.*;
import org.eclipse.swt.widgets.Display;
import org.eclipse.team.core.mapping.provider.SynchronizationContext;
import org.eclipse.team.internal.ccvs.ui.CVSDecoration;
import org.eclipse.team.internal.ccvs.ui.Policy;
import org.eclipse.team.internal.ccvs.ui.mappings.WorkspaceChangeSetCapability;
import org.eclipse.team.internal.ccvs.ui.mappings.WorkspaceModelParticipant;
import org.eclipse.team.internal.ccvs.ui.subscriber.CVSParticipantLabelDecorator;
import org.eclipse.team.internal.ui.Utils;
import org.eclipse.team.internal.ui.synchronize.ChangeSetCapability;
import org.eclipse.team.internal.ui.synchronize.SynchronizePageConfiguration;
import org.eclipse.team.ui.mapping.SynchronizationActionProvider;
import org.eclipse.team.ui.synchronize.*;

/**
 * A participant that uses our decorator instead of the standard one.
 */
public class CommitWizardParticipant extends WorkspaceModelParticipant {
	
    /**
     * The actions to be displayed in the context menu.
     */
    private class ActionContribution extends SynchronizePageActionGroup {
        @Override
		public void modelChanged(final ISynchronizeModelElement root) {
            super.modelChanged(root);
			Display.getDefault().asyncExec(() -> {
				final CommitWizardCommitPage page = fWizard.getCommitPage();
				if (page != null)
					page.updateForModelChange();
			});
        }
    }
    
    private WorkspaceChangeSetCapability capability;
    
    @Override
	public ChangeSetCapability getChangeSetCapability() {
    	if (capability == null) {
            capability = new WorkspaceChangeSetCapability() {
            	@Override
				public boolean supportsCheckedInChangeSets() {
            		return false;
            	}
            	@Override
				public boolean enableActiveChangeSetsFor(ISynchronizePageConfiguration configuration) {
            		return false;
            	};
            };
        }
        return capability;
    }

    /**
     * An extension of the standard label decorator which configures the keyword substitution 
     * mode according to the settings on the file type wizard page.
     */
    private static class Decorator extends CVSParticipantLabelDecorator {
        
        private final CommitWizard fWizard;

        public Decorator(ISynchronizePageConfiguration configuration, CommitWizard wizard) {
            super(configuration);
            fWizard= wizard;
        }
        
        @Override
		protected CVSDecoration getDecoration(IResource resource) throws CoreException {
            final CVSDecoration decoration= super.getDecoration(resource);
            final CommitWizardFileTypePage page= fWizard.getFileTypePage();
            
            if (page != null && resource instanceof IFile) 
                decoration.setKeywordSubstitution(page.getOption((IFile)resource).getShortDisplayText());
            return decoration;
        }
    }

	protected static final String ACTION_GROUP = "org.eclipse.tam.cvs.ui.CommitActions"; //$NON-NLS-1$
    
    final CommitWizard fWizard;
	protected Action showComparePaneAction;
    
    public CommitWizardParticipant(SynchronizationContext context, CommitWizard wizard) {
        super(context);
        fWizard= wizard;
    }
    
    @Override
	protected ILabelDecorator getLabelDecorator(ISynchronizePageConfiguration configuration) {
        return new Decorator(configuration, fWizard);
    }

    @Override
	protected void initializeConfiguration(final ISynchronizePageConfiguration configuration) {
        super.initializeConfiguration(configuration);
        configuration.setProperty(ISynchronizePageConfiguration.P_TOOLBAR_MENU, new String[] {ACTION_GROUP, ISynchronizePageConfiguration.NAVIGATE_GROUP});
        configuration.setProperty(ISynchronizePageConfiguration.P_CONTEXT_MENU, ISynchronizePageConfiguration.DEFAULT_CONTEXT_MENU);
		configuration.addMenuGroup(
				ISynchronizePageConfiguration.P_CONTEXT_MENU, 
				CONTEXT_MENU_CONTRIBUTION_GROUP_3);
        configuration.addActionContribution(new ActionContribution());

        // Wrap the container so that we can update the enablements after the runnable
        // (i.e. the container resets the state to what it was at the beginning of the
        // run even if the state of the page changed. Remove from View changes the state)
		configuration.setRunnableContext((fork, cancelable, runnable) -> {
			fWizard.getContainer().run(fork, cancelable, runnable);
			final CommitWizardCommitPage page = fWizard.getCommitPage();
			if (page != null)
				page.updateEnablements();
		});
        configuration.setSupportedModes(ISynchronizePageConfiguration.OUTGOING_MODE);
        configuration.setMode(ISynchronizePageConfiguration.OUTGOING_MODE);
        configuration.addActionContribution(new SynchronizePageActionGroup() {
        	@Override
			public void initialize(ISynchronizePageConfiguration configuration) {
        		super.initialize(configuration);
        		showComparePaneAction = new Action(null, Action.AS_CHECK_BOX) {
        			@Override
					public void run() {
        				fWizard.getCommitPage().showComparePane(this.isChecked());
        			}
        		};
        		Utils.initAction(showComparePaneAction, "ComnitWizardComparePaneToggle.", Policy.getActionBundle()); //$NON-NLS-1$
        		showComparePaneAction.setChecked(isComparePaneVisible());
        		appendToGroup(ISynchronizePageConfiguration.P_TOOLBAR_MENU, ACTION_GROUP, showComparePaneAction);
        	}
		});
        configuration.setProperty(SynchronizePageConfiguration.P_OPEN_ACTION, new Action() {
			@Override
			public void run() {
				ISelection selection = configuration.getSite().getSelectionProvider().getSelection();
				if(selection instanceof IStructuredSelection) {
					final Object obj = ((IStructuredSelection) selection).getFirstElement();
					if (fWizard.getParticipant().hasCompareInputFor(obj)) {
						fWizard.getCommitPage().showComparePane(true);
						showComparePaneAction.setChecked(true);
					}
				}
			}
        });
    }
    
    @Override
	public boolean doesSupportSynchronize() {
        return false;
    }
    
    private boolean isComparePaneVisible() {
    	IDialogSettings section = fWizard.getDialogSettings().getSection(CommitWizard.COMMIT_WIZARD_DIALOG_SETTINGS);
		return section == null ? false : section.getBoolean(CommitWizardCommitPage.SHOW_COMPARE);
    }

	@Override
	protected ModelSynchronizeParticipantActionGroup createMergeActionGroup() {
		return new WorkspaceMergeActionGroup() {
			@Override
			protected void addToContextMenu(String mergeActionId, Action action, IMenuManager manager) {
				if (mergeActionId == SynchronizationActionProvider.MERGE_ACTION_ID
						|| mergeActionId == SynchronizationActionProvider.OVERWRITE_ACTION_ID
						|| mergeActionId == SynchronizationActionProvider.MARK_AS_MERGE_ACTION_ID) {
					// skip merge actions
					return;
				}
				super.addToContextMenu(mergeActionId, action, manager);
			}

			@Override
			protected void appendToGroup(String menuId, String groupId,	IAction action) {
				if (menuId == ISynchronizePageConfiguration.P_CONTEXT_MENU
						&& groupId == WorkspaceModelParticipant.CONTEXT_MENU_COMMIT_GROUP_1) {
					// skip commit action
					return;
				}
				super.appendToGroup(menuId, groupId, action);
			}
		};
	}
}
