/*******************************************************************************
 * Copyright (c) 2000, 2006 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.team.internal.ccvs.ui.actions;
 
import java.lang.reflect.InvocationTargetException;

import org.eclipse.core.resources.IResource;
import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.core.runtime.Status;
import org.eclipse.jface.action.IAction;
import org.eclipse.jface.operation.IRunnableWithProgress;
import org.eclipse.jface.window.Window;
import org.eclipse.osgi.util.NLS;
import org.eclipse.team.core.TeamException;
import org.eclipse.team.core.synchronize.SyncInfo;
import org.eclipse.team.internal.ccvs.core.*;
import org.eclipse.team.internal.ccvs.ui.*;
import org.eclipse.team.internal.ccvs.ui.operations.RepositoryProviderOperation;
import org.eclipse.ui.IWorkbenchPart;

public class IgnoreAction extends WorkspaceTraversalAction {
    
    /**
     * Define an operation that can be run in the background.
     * We divide the ignores by provider to obtain project
     * locks while modifying the .cvsignore files
     */
    class IgnoreOperation extends RepositoryProviderOperation {

        private final IgnoreResourcesDialog dialog;

        public IgnoreOperation(IWorkbenchPart part, IResource[] resources, IgnoreResourcesDialog dialog) {
            super(part, resources);
            this.dialog = dialog;
        }

        @Override
		protected String getTaskName(CVSTeamProvider provider) {
            return NLS.bind(CVSUIMessages.IgnoreAction_0, new String[] { provider.getProject().getName() }); 
        }

        @Override
		protected void execute(CVSTeamProvider provider, IResource[] resources, boolean recurse, IProgressMonitor monitor) throws CVSException, InterruptedException {
			try {
			    monitor.beginTask(null, resources.length);
				for (int i = 0; i < resources.length; i++) {
					IResource resource = resources[i];
					String pattern = dialog.getIgnorePatternFor(resource);
					ICVSResource cvsResource = getCVSResourceFor(resource);
					cvsResource.setIgnoredAs(pattern);
					monitor.worked(1);
				}
			} catch (TeamException e) {
				collectStatus(e.getStatus());
				return;
			} finally {
			    monitor.done();
			}
			collectStatus(Status.OK_STATUS);
        }

        @Override
		protected String getTaskName() {
            return CVSUIMessages.IgnoreAction_1; 
        }
        
    	@Override
		public boolean consultModelsForMappings() {
    		return false;
    	}
        
    }
	
	@Override
	protected void execute(final IAction action) throws InvocationTargetException, InterruptedException {
		run((IRunnableWithProgress) monitor -> {
			IResource[] resources = getSelectedResources();
			IgnoreResourcesDialog dialog = new IgnoreResourcesDialog(getShell(), resources);
			if (dialog.open() != Window.OK)
				return;
			new IgnoreOperation(getTargetPart(), resources, dialog).run();

			// if (action != null) action.setEnabled(isEnabled());
		}, false /* cancelable */, PROGRESS_BUSYCURSOR);
	}
	/**
	 * @see org.eclipse.team.internal.ccvs.ui.actions.CVSAction#getErrorTitle()
	 */
	@Override
	protected String getErrorTitle() {
		return CVSUIMessages.IgnoreAction_ignore; 
	}

	/**
	 * @see org.eclipse.team.internal.ccvs.ui.actions.WorkspaceAction#isEnabledForManagedResources()
	 */
	@Override
	protected boolean isEnabledForManagedResources() {
		return false;
	}

	/**
	 * @see org.eclipse.team.internal.ccvs.ui.actions.WorkspaceAction#isEnabledForUnmanagedResources()
	 */
	@Override
	protected boolean isEnabledForUnmanagedResources() {
		return true;
	}
	
	@Override
	protected boolean isEnabledForCVSResource(ICVSResource cvsResource) throws CVSException {
		if (super.isEnabledForCVSResource(cvsResource)) {
			// Perform an extra check against the subscriber to ensure there is no conflict
			CVSWorkspaceSubscriber subscriber = CVSProviderPlugin.getPlugin().getCVSWorkspaceSubscriber();
			IResource resource = cvsResource.getIResource();
			if (resource == null) return false;
			try {
				SyncInfo info = subscriber.getSyncInfo(resource);
				return ((info.getKind() & SyncInfo.DIRECTION_MASK) == SyncInfo.OUTGOING);
			} catch (TeamException e) {
				// Let the enablement happen
				return true;
			}
		}
		return false;
	}
	
	@Override
	public String getId() {
		return ICVSUIConstants.CMD_IGNORE;
	}
}
