/*******************************************************************************
 * Copyright (c) 2000, 2016 IBM Corporation and others.
 * All rights reserved. This program and the accompanying materials
 * are made available under the terms of the Eclipse Public License v1.0
 * which accompanies this distribution, and is available at
 * http://www.eclipse.org/legal/epl-v10.html
 *
 * Contributors:
 *     IBM Corporation - initial API and implementation
 *******************************************************************************/
package org.eclipse.releng.tools;

import java.lang.reflect.InvocationTargetException;
import java.util.ArrayList;
import java.util.List;

import org.eclipse.compare.CompareConfiguration;
import org.eclipse.compare.CompareEditorInput;
import org.eclipse.compare.ResourceNode;
import org.eclipse.compare.structuremergeviewer.DiffNode;
import org.eclipse.compare.structuremergeviewer.Differencer;
import org.eclipse.compare.structuremergeviewer.IDiffElement;
import org.eclipse.core.resources.IProject;
import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.jface.viewers.Viewer;
import org.eclipse.swt.graphics.Image;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.team.internal.ccvs.core.CVSException;
import org.eclipse.team.internal.ccvs.core.CVSTag;
import org.eclipse.team.internal.ccvs.ui.CVSUIPlugin;

/**
 * This class extends<code>CompareEditorInput<code>. It defines the input for map file compare editor, which is showed by
 * <code>MapFileComparePage<code>
 */
public class MapFileCompareEditorInput extends CompareEditorInput {
	
	private MapContentDocument[] documents;
	private DiffNode root;
	private Viewer viewer;
	private MapProject mapProject;
	
	private IProject[] selectedProjects;
	private String tag;	//The proposed tag

	
	public MapFileCompareEditorInput() {
		super(new CompareConfiguration());
		documents = new MapContentDocument[0];
		root = new DiffNode(Differencer.NO_CHANGE) {
			@Override
			public boolean hasChildren() {
				return true;
			}
		};
		mapProject = null;
	}

	@Override
	protected Object prepareInput(IProgressMonitor monitor) throws InvocationTargetException, InterruptedException {
		CompareConfiguration config = getCompareConfiguration();
		config.setRightEditable(false);
		config.setLeftEditable(false);
		config.setRightLabel("Proposed change");
		config.setLeftLabel("Current content");
		return root;
	}

	public void updateInput(IProject[] projects, String tag) {
		setSelectedProjects(projects);
		setTag(tag);		
		MapContentDocument[] docs = constructDocuments();
		setDocuments(docs);
		buildTree();
	}
	@Override
	public Viewer createDiffViewer(Composite parent) {
		viewer =  super.createDiffViewer(parent);
		viewer.setInput(this);
		return viewer;
	}
	
	public void updateMapProject(MapProject m){
		mapProject = m;
	}

	private void setDocuments(MapContentDocument[] docs) {
		this.documents = docs;
	}
	
	

	private void buildTree() {
		if(documents  == null || documents.length == 0)return;
		//Empty the tree
		if(root.hasChildren()){
			IDiffElement[] children = root.getChildren();
			for(int i = 0; i < children.length; i++){
				root.remove(children[i]);
			}
		}

		//rebuild the tree
		DiffNode[] diffNodes = new DiffNode[documents.length];
		for (int i = 0; i < diffNodes.length; i++){
			ResourceNode resourceNode = new ResourceNode(documents[i].getMapFile().getFile()) {
				@Override
				public boolean isEditable() {
					return false;
				} 
			};
						
			diffNodes[i] = new DiffNode(root, Differencer.CHANGE, null, resourceNode, documents[i]) {
				@Override
				public Image getImage() {
					return getLeft().getImage();
				}
			};
		}
		viewer.refresh();
	} 
	
	/*
	 * Returns the map files that will change due to the projects being released
	 */
	private MapFile[] getChangedMapFiles() {
		if (selectedProjects == null || selectedProjects.length == 0)
			return null;
		List<IProject> projectList = new ArrayList<IProject>();
		CVSTag[] tags = mapProject.getTagsFor(selectedProjects );
		for(int i = 0; i < selectedProjects.length; i++){
			if(!tags[i].getName().equals(tag)){
				projectList.add(selectedProjects[i]);
			}
		}
		IProject [] projects = projectList.toArray(new IProject[projectList.size()]);
		return mapProject.getMapFilesFor(projects);
	}
	

	//Construct the document as the diffNode. 
	private MapContentDocument [] constructDocuments(){
		MapFile[] mapFiles = getChangedMapFiles();
		if(mapFiles == null || mapFiles.length ==0) return null;
		MapContentDocument [] docs = new MapContentDocument[mapFiles.length];
		for(int i = 0; i < mapFiles.length; i++){
			docs[i] = new MapContentDocument(mapFiles[i]);
			for(int j = 0; j < selectedProjects.length; j++){
				//update the new content of each selected projects
				if(mapFiles[i].contains(selectedProjects[j])){
					try {
						docs[i]. updateTag(selectedProjects[j],tag);
					} catch (CVSException e) {
						CVSUIPlugin.openError(null, null, null, e);
					}
				}
			}
		}
		return docs;
	}
	
	private void setSelectedProjects(IProject[] projects) {
		if (projects != null && projects.length != 0) {
			selectedProjects = new IProject[projects.length ];
			System.arraycopy(projects, 0, selectedProjects, 0, projects.length);
		}
	}
	
	private void setTag(String t) {
		this.tag = t;
	}
}
