/*******************************************************************************
 * Copyright (c) 2004, 2008 Tasktop Technologies 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:
 *     Tasktop Technologies - initial API and implementation
 *******************************************************************************/

package org.eclipse.mylyn.internal.sandbox.bridge.bugs;

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

import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.core.runtime.IStatus;
import org.eclipse.core.runtime.Status;
import org.eclipse.core.runtime.jobs.Job;
import org.eclipse.jdt.core.IJavaElement;
import org.eclipse.jdt.core.IMember;
import org.eclipse.mylyn.context.core.InterestComparator;
import org.eclipse.mylyn.internal.context.core.IActiveSearchListener;
import org.eclipse.mylyn.internal.context.core.IActiveSearchOperation;

/**
 * Used to facilitate bugzilla searches based on IJavaElements
 * 
 * @author Shawn Minto
 */
public class BugzillaMylynSearch implements IActiveSearchOperation {

	// scope identifiers
	public static final int LOCAL_QUAL = 1; // local implies a bugzilla task,

	// not just an offline report

	public static final int LOCAL_UNQUAL = 2;

	public static final int FULLY_QUAL = 3;

	public static final int UNQUAL = 4;

	private final int scope;

	private final IJavaElement element;

	private String handle = "";

	private String serverUrl = "";

	/**
	 * Constructor
	 * 
	 * @param scope
	 *            The scope of this search
	 */
	public BugzillaMylynSearch(int scope, IJavaElement element, String serverUrl) {
		this.scope = scope;
		this.element = element;
		this.serverUrl = serverUrl;
	}

	public IStatus run(IProgressMonitor monitor) {
		return run(monitor, Job.DECORATE);
	}

	public IStatus run(IProgressMonitor monitor, int priority) {
		handle = element.getHandleIdentifier() + " " + scope;
		List<IJavaElement> landmarks = new ArrayList<IJavaElement>();
		landmarks.add(element);

		if (!BugzillaSearchManager.doesJobExist(handle)) {

			// perform the bugzilla search
			// get only the useful landmarks (IMember)
			List<IMember> members = getMemberLandmarks(landmarks);

			// go through all of the landmarks that we are given and perform a
			// search on them
			for (IMember m : members) {

				// FIXME: decide whether to do leave the caching of searches in
				// for now or not
				// check if we have the info cached
				// List<BugzillaReportNode> landmarkDoi =
				// MylarTaskListPlugin.getBridge()
				// .getFromLandmarksHash(m, scope);

				// if (landmarkDoi != null) {
				// //TODO decide when to queue up and do a refresh search
				// notifySearchCompleted(landmarkDoi);
				// continue;
				// }

				// create a search operation so that we can search
				BugzillaMylynSearchOperation op = new BugzillaMylynSearchOperation(this, m, scope);

				// create a new search job so that it can be scheduled and
				// run as a background thread
				Job searchJob = new BugzillaMylynSearchJob("Querying Bugzilla Server - Mylar - "
						+ op.getSearchMemberName(), op);

				// schedule the new search job
				searchJob.setPriority(priority);
				searchJob.schedule();

				// save this searchJobs handle so that we can cancel it if need
				// be
				BugzillaSearchManager.addJob(handle, searchJob);
			}
		}
		return Status.OK_STATUS;
	}

	/** List of listeners wanting to know about the searches */
	private final List<IActiveSearchListener> listeners = new ArrayList<IActiveSearchListener>();

	/**
	 * Add a listener for when the bugzilla search is completed
	 * 
	 * @param l
	 *            The listener to add
	 */
	public void addListener(IActiveSearchListener l) {
		// add the listener to the list
		listeners.add(l);
	}

	/**
	 * Remove a listener for when the bugzilla search is completed
	 * 
	 * @param l
	 *            The listener to remove
	 */
	public void removeListener(IActiveSearchListener l) {
		// remove the listener from the list
		listeners.remove(l);
	}

	/**
	 * Notify all of the listeners that the bugzilla search is completed
	 * 
	 * @param doiList
	 *            A list of BugzillaSearchHitDoiInfo
	 * @param member
	 *            The IMember that the search was performed on
	 */
	public void notifySearchCompleted(List<BugzillaReportInfo> doiList) {
		// go through all of the listeners and call searchCompleted(colelctor,
		// member)
		BugzillaSearchManager.removeSearchJob(handle);
		for (IActiveSearchListener listener : listeners) {
			listener.searchCompleted(doiList);
		}
	}

	/**
	 * Get only the landmarks that are IMember and sort them according to their DOI value (highest to lowest)
	 * 
	 * @param landmarks
	 *            The landmarks to check
	 * @return List of IMember landmarks sorted by DOI value
	 */
	public static List<IMember> getMemberLandmarks(List<IJavaElement> landmarks) {
		List<IMember> memberLandmarks = new ArrayList<IMember>();

		for (IJavaElement je : landmarks) {

			// keep only the IMember landmarks
			if (je instanceof IMember) {
				memberLandmarks.add((IMember) je);
			}
		}

		// sort the landmarks
		Collections.sort(memberLandmarks, new InterestComparator<IMember>());

		return memberLandmarks;
	}

	public String getServerUrl() {
		return serverUrl;
	}

}
