/*******************************************************************************
 * Copyright (c) 2000, 2015 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.jface.text.revisions;

import java.util.ArrayList;
import java.util.Collections;
import java.util.Iterator;
import java.util.List;

import org.eclipse.core.runtime.Assert;

import org.eclipse.jface.internal.text.revisions.Hunk;

import org.eclipse.jface.text.IInformationControlCreator;
import org.eclipse.jface.text.ITextHoverExtension;
import org.eclipse.jface.text.information.IInformationProviderExtension2;

/**
 * Encapsulates revision information for one line-based document.
 * <p>
 * Clients may instantiate.
 * </p>
 *
 * @since 3.2
 * @see Revision
 */
public final class RevisionInformation implements ITextHoverExtension, IInformationProviderExtension2 {
	/** The revisions. */
	private final List<Revision> fRevisions= new ArrayList<>();
	/** A unmodifiable view of <code>fRevisions</code>. */
	private final List<Revision> fRORevisions= Collections.unmodifiableList(fRevisions);
	/**
	 * The flattened list of {@link RevisionRange}s, unmodifiable. <code>null</code> if the list
	 * must be re-computed.
	 *
	 * @since 3.3
	 */
	private List<RevisionRange> fRanges= null;

	/**
	 * The hover control creator. Can be <code>null</code>.
	 *
	 * @since 3.3
	 */
	private IInformationControlCreator fHoverControlCreator;

	/**
	 * The information presenter control creator. Can be <code>null</code>.
	 *
	 * @since 3.3
	 */
	private IInformationControlCreator fInformationPresenterControlCreator;

	/**
	 * Creates a new revision information model.
	 */
	public RevisionInformation() {
	}

	/**
	 * Adds a revision.
	 *
	 * @param revision a revision
	 */
	public void addRevision(Revision revision) {
		Assert.isLegal(revision != null);
		fRevisions.add(revision);
	}

	/**
	 * Returns the contained revisions.
	 *
	 * @return an unmodifiable view of the contained revisions
	 */
	public List<Revision> getRevisions() {
		return fRORevisions;
	}

	/**
	 * Returns the line ranges of this revision information. The returned information is only valid
	 * at the moment it is returned, and may change as the annotated document is modified. See
	 * {@link IRevisionListener} for a way to be informed when the revision information changes. The
	 * returned list is sorted by document offset.
	 *
	 * @return an unmodifiable view of the line ranges
	 * @see IRevisionListener
	 * @since 3.3
	 */
	public List<RevisionRange> getRanges() {
		if (fRanges == null) {
			List<RevisionRange> ranges= new ArrayList<>(fRevisions.size() * 2); // wild size guess
			for (Iterator<Revision> it= fRevisions.iterator(); it.hasNext();) {
				Revision revision= it.next();
				ranges.addAll(revision.getRegions());
			}

			// sort by start line
			Collections.sort(ranges, (r1, r2) -> r1.getStartLine() - r2.getStartLine());

			fRanges= Collections.unmodifiableList(ranges);
		}
		return fRanges;
	}

	/**
	 * Adjusts the revision information to the given diff information. Any previous diff information
	 * is discarded. <strong>Note:</strong> This is an internal framework method and must not be
	 * called by clients.
	 *
	 * @param hunks the diff hunks to adjust the revision information to
	 * @since 3.3
	 * @noreference This method is not intended to be referenced by clients.
	 */
	public void applyDiff(Hunk[] hunks) {
		fRanges= null; // mark for recomputation
		for (Iterator<Revision> revisions= getRevisions().iterator(); revisions.hasNext();)
			revisions.next().applyDiff(hunks);
	}

	@Override
	public IInformationControlCreator getHoverControlCreator() {
		return fHoverControlCreator;
	}

	/**
	 * {@inheritDoc}
	 * @return the information control creator or <code>null</code>
	 * @since 3.3
	 */
	@Override
	public IInformationControlCreator getInformationPresenterControlCreator() {
		return fInformationPresenterControlCreator;
	}

	/**
	 * Sets the hover control creator.
	 * <p>
	 * <strong>Note:</strong> The created information control must be able to display the object
	 * returned by the concrete implementation of {@link Revision#getHoverInfo()}.
	 * </p>
	 *
	 * @param creator the control creator
	 * @since 3.3
	 */
	public void setHoverControlCreator(IInformationControlCreator creator) {
		fHoverControlCreator= creator;
	}

	/**
	 * Sets the information presenter control creator.
	 *
	 * @param creator the control creator
	 * @since 3.3
	 */
	public void setInformationPresenterControlCreator(IInformationControlCreator creator) {
		fInformationPresenterControlCreator= creator;
	}
}
