/*******************************************************************************
 * 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.tags;

import java.util.*;

import org.eclipse.core.resources.IProject;
import org.eclipse.core.resources.ResourcesPlugin;
import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.osgi.util.NLS;
import org.eclipse.team.core.RepositoryProvider;
import org.eclipse.team.core.TeamException;
import org.eclipse.team.internal.ccvs.core.*;
import org.eclipse.team.internal.ccvs.core.resources.CVSWorkspaceRoot;
import org.eclipse.team.internal.ccvs.ui.CVSUIMessages;
import org.eclipse.team.internal.ccvs.ui.CVSUIPlugin;

/**
 * Tag source that gets its tags from the projects exist in the workspace
 */
public class LocalProjectTagSource extends TagSource {
    
    public static TagSource create(IProject seedProject) {
        try {
            ICVSRemoteFolder seedFolder = ((ICVSRemoteFolder)CVSWorkspaceRoot.getRemoteResourceFor(seedProject));
            ICVSRemoteFolder[] remoteFolders = getProjectRemoteFolders();
            if (remoteFolders.length == 1) {
                // There are no other projects to get tags from so return null
                return null;
            }
            return new LocalProjectTagSource(seedFolder, remoteFolders);
        } catch (CVSException e) {
            // Log and return null
            CVSUIPlugin.log(e);
            return null;
        }
    }
    
    private ICVSRemoteFolder seedFolder;
    private ICVSRemoteFolder[] remoteFolders;

    private  LocalProjectTagSource(ICVSRemoteFolder seedFolder, ICVSRemoteFolder[] remoteFolders) {
        this.seedFolder = seedFolder;
        this.remoteFolders = remoteFolders;
    }

    /*
     * Return the list of remote folders for the projects in the workspace mapped to the given repository
     */
    private static ICVSRemoteFolder[] getProjectRemoteFolders() {
        IProject[] projects = ResourcesPlugin.getWorkspace().getRoot().getProjects();
		List<ICVSRemoteFolder> result = new ArrayList<>();
        for (int i = 0; i < projects.length; i++) {
            IProject project = projects[i];
            try {
                if (project.isAccessible() && RepositoryProvider.isShared(project)) {
                    ICVSRemoteFolder remote = (ICVSRemoteFolder)CVSWorkspaceRoot.getRemoteResourceFor(project);
                    if (remote != null) {
                        result.add(remote);
                    }
                }
            } catch (CVSException e) {
                // Log and continue
                CVSUIPlugin.log(e);
            }
        }
        return result.toArray(new ICVSRemoteFolder[result.size()]);
    }

    @Override
	public CVSTag[] refresh(boolean bestEffort, IProgressMonitor monitor) throws TeamException {
        // This tag source should not be refreshed
        return new CVSTag[0];
    }

    @Override
	public ICVSRepositoryLocation getLocation() {
        return seedFolder.getRepository();
    }

    @Override
	public String getShortDescription() {
        return NLS.bind(CVSUIMessages.LocalProjectTagSource_0, new String[] { Integer.toString(remoteFolders.length) }); 
    }

    @Override
	public void commit(CVSTag[] tags, boolean replace, IProgressMonitor monitor) throws CVSException {
        // Does not commit tags
    }

    @Override
	public ICVSResource[] getCVSResources() {
        return remoteFolders;
    }
    
    @Override
	public CVSTag[] getTags(int type) {
        if (type == CVSTag.HEAD || type == BASE) {
            return super.getTags(type);
        }
        // Accumulate the tags for all folders
		Set<CVSTag> allTags = new HashSet<>();
        for (int i = 0; i < remoteFolders.length; i++) {
            ICVSRemoteFolder folder = remoteFolders[i];
            CVSTag[] tags = SingleFolderTagSource.getTags(folder, type);
            allTags.addAll(Arrays.asList(tags));
        }
        // Exclude the tags for the seedFolder
        CVSTag[] tags = SingleFolderTagSource.getTags(seedFolder, type);
        allTags.removeAll(Arrays.asList(tags));
        return allTags.toArray(new CVSTag[allTags.size()]);
    }

}
